我使用DelimitedLineTokenizer使用FlatFileItemReader从txt文件中读取。但是,有没有办法避免硬编码字段的“名称”属性?相反,我们可以使用任何bean吗?
<bean id="employeeReader" class="org.springframework.batch.item.file.FlatFileItemReader"
scope="step">
<property name="resource" value="#{jobParameters['input.file.name']}" />
<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="empId,empName,empAge" />
</bean>
</property>
<property name="fieldSetMapper">
<bean
class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper">
<property name="targetType" value="com.example.Employee" />
</bean>
</property>
</bean>
</property>
</bean>
答案 0 :(得分:1)
目前没有,因为LineTokenizer
的工作结果是FieldSet
。 FieldSet
类似于文件的ResultSet
。就像在ResultSet
中一样,我们需要引用每个&#34;列&#34;通过在这种情况下是名称的东西。 LineTokenizer
无法了解数据的最终位置(对象的外观),因此我们无法对其进行内省。如果您想采用更加动态的方法,那么您需要实现自己的LineMapper
,它将两个函数结合在一起,允许进行这种类型的内省。
与往常一样,拉取请求表示赞赏!
答案 1 :(得分:0)
除了Michael Minella's answer之外,您还能做些什么:
您可以在#{jobParameter['key']}
代码中使用#{jobExecutionContext['key']}
,#{stepExecutionContext['key']}
或<property name="names">
等值。
这意味着您可以拥有一个执行业务逻辑的步骤或侦听器,并随时在ExecutionContext
中保存结果:
stepExecution.getJobExecution().getExecutionContext().put(key, value);
请记住,names
的字段DelimitedLineTokenizer
需要一个字符串(不是真的,但足够接近),而不是bean。