我使用spring批处理自动读取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>
答案 0 :(得分:1)
Spring-batch按预期顺序读取和标记CSV中的字段
问题出在BeanWrapperFieldSetMapper
:将FieldSet
值注入bean的属性映射器,从String[]
(按字段名称排序)传递到Properties
(查看FieldSet.getProperties()
})匹配属性值
我认为您可以在阅读后使用StepExecutionListener和拦截项目实现目标(您将mappedPosition
完全取消)