如何避免DelimitedLineTokenizer名称中的硬编码名称?

时间:2015-10-07 13:58:54

标签: spring spring-batch

我使用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>

2 个答案:

答案 0 :(得分:1)

目前没有,因为LineTokenizer的工作结果是FieldSetFieldSet类似于文件的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。