2013-08-21 52 views
0

我使用spring批處理自動讀取csv文件並將每行映射到對象中。下面有代碼。 csv文件中的列是ID,field1,field2,field3。這是我在lineTokenizer中編寫的順序。但是,FlatFileItemReader未按此順序讀取文件。相反,它看起來像隨機順序讀取,先讀取field2,然後是ID,然後是field3,然後是field1。但我希望它首先讀取ID,因爲我正在嘗試編寫一個將ID映射到每個字段的映射。有沒有辦法改變FlatFileItemReader在csv中讀取列的順序?Spring按批次順序讀取csv列

<bean id="mappedPosition" class="com.jpmorgan.ib.colopt.input.MappedPosition" scope="prototype" /> 
<bean id="positionFileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader"> 
     <property name="resource" value="position.csv" /> 
     <property name="lineMapper"> 
      <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper"> 
       <property name="lineTokenizer"> 
         <bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer"> 
          <property name="names" value="ID, field1, field2, field3" /> 
         </bean> 
        </property> 
        <property name="fieldSetMapper"> 
         <bean class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper"> 
           <property name="prototypeBeanName" value="mappedPosition"/> 
         </bean> 
        </property> 
       </bean> 
     </property> 
</bean> 

回答

1

按預期順序從CSV按順序彈出批量讀取和標記字段。
問題出在BeanWrapperFieldSetMapper:將FieldSet值注入到從String[](按字段名稱排序)到Properties(看FieldSet.getProperties())以匹配屬性值的bean屬性映射程序中。
我想你可以用StepExecutionListener來實現你的目標並且在看完之後攔截項目(你會得到你的mappedPosition完全浮動)