0

我正在使用 Spring Batch 自动读取 csv 文件并将每一行映射到一个对象中。下面有代码。csv 文件中的列是 ID、field1、field2、field3。这是我在 lineTokenizer 中写的顺序。但是,FlatFileItemReader 没有按此顺序读取文件。相反,它似乎以随机顺序读取,首先读取 field2,然后是 ID,然后是 field3,然后是 field1。但我希望它首先读取 ID,因为我正在尝试编写一个将 ID 映射到每个字段的映射。有没有办法改变 FlatFileItemReader 读取 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>
4

1 回答 1

1

正如预期的那样,Spring-batch 按顺序从 CSV 读取和标记字段。
问题在于BeanWrapperFieldSetMapper:将FieldSet值注入到 bean 的属性映射器中,从String[](以您的字段名称排序)传递到Properties(查找FieldSet.getProperties())以匹配属性值。
我认为您可以使用StepExecutionListener实现目标并在阅读后拦截项目(您将mappedPosition完全填充)

于 2013-08-21T14:15:15.860 回答