2012-09-12 7 views
6

Chcę utworzyć płaski plik, który ma poniższy format:Wiosna partii: Pisanie nazwy kolumn jako pierwszy wiersz w płaskiej pliku

Col1Name;Col2Name;Col3Name 
one;23;20120912 
two;28;20120712 

Jak widać, pierwszy wiersz w pliku płaskiego są nazwy kolumn.

Jak osiągnąć to poprzez wywołanie zwrotne nagłówka?

widzę, że jeśli plik wejściowy jest powyżej formatu, istnieje opcja, jak poniżej, aby zignorować pierwszy wiersz:

<property name="firstLineIsHeader" value="true"/> 

Również ten Jira Issue wskazuje, że to, co chcę jest implemeted i zamknięte. Jednak nie jestem w stanie znaleźć żadnego przykładu pisania pierwszego wiersza jako nazwy kolumn.

<beans:bean id="MyFileItemWriter" class="com.nik.MyFileItemWriter" scope="step"> 
    <beans:property name="delegate"> 
     <beans:bean class="org.springframework.batch.item.file.FlatFileItemWriter"> 
      <beans:property name="resource" value="file:MYFILE.dat" /> 

      <beans:property name="lineAggregator"> 
       <beans:bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator"> 
        <beans:property name="delimiter" value=";" /> 
        <beans:property name="fieldExtractor"> 
         <beans:bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor"> 
          <beans:property name="names" value="Col1Name, Col2Name, Col3Name" /> 
         </beans:bean> 
        </beans:property> 
       </beans:bean> 
      </beans:property> 
      <beans:property name="headerCallback" ref="MyFileItemWriter" /> 
     </beans:bean> 
    </beans:property> 
</beans:bean> 

Moja pozycja Writer wygląda jak poniżej:

public class MyFileItemWriter implements ItemWriter<MyBean>, FlatFileHeaderCallback, ItemStream{ 

private FlatFileItemWriter<MyBean> delegate;  

public void setDelegate(final FlatFileItemWriter<MyBean> delegate) { 
     this.delegate = delegate; 
    } 

public void writeHeader(Writer writer) throws IOException { 


} 

public void write(List<? extends MyBean> items) throws Exception { 
    this.delegate.write(items); 

} 

public void close() throws ItemStreamException { 
    this.delegate.close(); 

} 

public void open(ExecutionContext arg0) throws ItemStreamException { 
    this.delegate.open(arg0); 

} 

public void update(ExecutionContext arg0) throws ItemStreamException { 
    this.delegate.update(arg0);   
} 

} 

Dzięki za czytanie!

Odpowiedz

5

dobrze zrobił spróbować pracy z

public void writeHeader(Writer writer) throws IOException { 
     //... e.g. writer.write("my first line"); 

    } 
+0

Tak, mogę to zrobić. Ale myślałem, że to będzie synonimem twardego kodowania. Zamiast tego, myślałem, że istnieje sposób, aby wyświetlić listę nagłówków bezpośrednio z nazw właściwości fasoli automatycznie. Chcemy więc potwierdzić, że nie ma takiej dostępnej funkcjonalności. Jeśli nie, pójdę w powyższy sposób. – Nik

+0

, aby zminimalizować kodowanie, można ponownie użyć listy nazw atrybutów przy użyciu np. http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/xsd-config.html#xsd-config-body-schemas-util-list –

+0

Dzięki! Zajrzę do tego. Czy możesz sprawdzić moje nowe pytanie - Footer Call Back otrzymuję wezwanie po wezwaniu AfterStep ... – Nik

11

utworzyć klasę niestandardową, która rozciąga się FlatFileItemWriter i implementuje tylko konstruktor:

public class MyFlatFileWriter extends FlatFileItemWriter { 

    public MyFlatFileWriter(){ 
     super.setHeaderCallback(new FlatFileHeaderCallback() { 

      public void writeHeader(Writer writer) throws IOException { 
       writer.write("Col1Name,Col2Name,Col3Name"); 

      } 
     }); 
    } 

a następnie użyć tej klasy w atrybucie klasy konfiguracji fasola

0

FlatFileItemWriter umożliwia dodanie nagłówka oddzwonienia

headerCallback zostanie wywołany przed zapisaniem pierwszego elementu do pliku.

Więc trzeba zaimplementować swój oddzwanianie żniwna wdrażając FlatFileHeaderCallback

Or Use Default Implementation