2017-07-17 2 views
0

Je suis en train d'écrire une application Spring Batch qui lit un fichier CSV, effectue une transformation et écrit un fichier CSV modifié à envoyer à un autre processus batch.Spring Batch BeanWrapperFieldExtractor pour un grand nombre de champs

Ma configuration écrivain ressemble à ceci:

<beans:property name="lineAggregator"> 
<beans:bean class="org.springframework.batch.item.file.transform.FormatterLineAggregator"> 
     <beans:property name="fieldExtractor"> 
       <beans:bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor"> 
       <beans:property name="names" value="column1, column2, column3, column4 ------ 322 fields " /> 
       </beans:bean> 
      </beans:property> 

      <beans:property name="format" value="%-8s%-12s%-11s%-16s" ----322 fields /> 
     </beans:bean> 
    </beans:property> 

Je dois écrire autour de 322 champs. Je suis incapable d'obtenir FormatterLineAggregator pour faire mon travail. Si j'écris le format comme

<property name="format" value="%s;%s;%s;%s;%s;%s;%s;%f;%f;%s;%f;%f;%td.%tm.%​tY;%td.%tm.%<‌​tY;%s;%td.%tm.%&‌​lt;tY;%s;%s;%s;%s;%t‌​d.%tm.%tY" /> , 

il devient vraiment salissant et il est difficile de s'assurer que tous les champs sont corrects.

Je pensais que 3 solutions différentes:

  1. Ou aller avec l'approche ci-dessus. Ecrivez un CustomEditorFieldsExtractor mais ne savez pas quoi écrire dans la classe et comment formater les champs. (Preffered)

  2. Utilisez un bean framework BeanIO "non standard", mais je crains que mon client ne soit pas d'accord avec cette solution.

Est-ce que quelqu'un peut fournir certaines entrées? Apprécier ton aide!

Répondre

0

Vous pouvez procéder à la solution n ° 2 de cette façon:

  1. Externaliser comment formater chaque propriété de vous classe de haricots (par exemple, au format XML ou fichier texte)
  2. Ecrire une coutume LineAggregator et de le rendre travaux couplé à la directive au point 1

class Aggregator implements LineAggregator<T> { 
    private Map<String, String> propertyFormat; 

    public String aggregate(T item) { 
    final StringBuilder sb = new StringBuilder(); 
    for(final String property : propertyFormat.keySet()) { 
     final String format = propertyFormat.get(property); 
     final Object propertyValue = /* Extract property from item using Spring beans */; 
     sb.append(String.format(format, propertyValue)); 
    } 
    return sb.toString(); 
    } 
}