2012-09-12 29 views
6

Tôi muốn tạo ra một tập tin phẳng trong đó có các định dạng dưới đây:mùa xuân hàng loạt: Viết tên cột như dòng đầu tiên trong tập tin phẳng

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

Như đã thấy, dòng đầu tiên trong file phẳng là tên cột.

Làm thế nào để đạt được điều này thông qua gọi lại tiêu đề?

Tôi thấy rằng nếu các tập tin đầu vào là các định dạng trên, có là một lựa chọn như dưới đây để bỏ qua dòng đầu tiên:

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

Ngoài ra, Jira Issue điều này chỉ ra rằng những gì tôi muốn là implemeted và đóng cửa. Tuy nhiên, tôi không thể tìm thấy bất kỳ ví dụ nào để viết dòng đầu tiên dưới dạng tên cột.

<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> 

My mục Writer trông như sau:

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);   
} 

} 

Thanks for reading!

Trả lời

5

cũng đã làm bạn cố gắng làm việc với

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

    } 
+0

Vâng, tôi có thể làm điều đó. Nhưng tôi nghĩ điều đó sẽ đồng nghĩa với việc viết mã cứng. Thay vào đó, tôi nghĩ rằng sẽ có một cách để liệt kê trực tiếp tiêu đề từ các tên thuộc tính bean một cách tự động. Vì vậy, muốn xác nhận rằng không có chức năng như vậy có sẵn. Nếu không, tôi sẽ đi theo cách trên. – Nik

+0

để giảm thiểu mã hóa cứng, bạn có thể sử dụng lại danh sách tên thuộc tính, ví dụ: http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/xsd-config.html#xsd-config-body-schemas-util-list –

+0

Cảm ơn! Sẽ nhìn vào nó. Bạn có thể vui lòng xem câu hỏi mới được đăng bởi tôi - Footer Call Back được gọi sau khi gọi AfterStep ... – Nik

11

tạo một lớp tùy chỉnh mà mở rộng FlatFileItemWriter và thực hiện chỉ các nhà xây dựng:

public class MyFlatFileWriter extends FlatFileItemWriter { 

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

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

      } 
     }); 
    } 

và sau đó sử dụng lớp này trong các thuộc tính lớp cấu hình đậu

0

FlatFileItemWriter cung cấp cho bạn tùy chọn thêm gọi lại tiêu đề

tiêu đềCallback sẽ được gọi trước khi ghi mục đầu tiên cần gửi.

Vì vậy, bạn cần phải thực hiện Tiêu đề Callback của bạn bằng cách thực hiện FlatFileHeaderCallback

Hoặc Use Default Implementation

Các vấn đề liên quan