我正在使用spring批处理来解析我的文件。在ItemProcessor中,我验证传入字段是否正确。如果不是,我想抛出ValidationException并将相应的行记录到文件中,该行具有不正确的字段。那么,如何在ItemProcessor中找到行数和文件名?
答案 0 :(得分:1)
没有看到你的ItemReader配置我真的不能确定,但如果你使用类似FlatFileItemReader的东西来解析csv,如果在严格模式下它将验证列数。
假设读者看起来像这样,那就是:
<bean id="iItemReader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step">
<property name="linesToSkip" value="1"/>
<property name="comments" value="#" />
<property name="encoding" value="UTF-8"/>
<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="delimiter" value=","/>
<property name="names">
<list >
<value>First_Field</value>
<value>Second_Field</value>
</list>
</property>
<property name="strict" value="true"/>
</bean>
</property>
<property name="fieldSetMapper">
<bean class="uk.co.package.FieldSetMapper">
<property name="dateFormat" value="yyyy-MM-dd HH:mm:ss"/>
</bean>
</property>
</bean>
</property>
</bean>
它将为任何无法处理的行抛出FlatFileParseException。这包括行号,可以在监听器中处理。
答案 1 :(得分:0)
对于行号,您可以构建自己的LineMapper,然后将行号存储在业务对象中。我将未处理的行(原样)与行号一起存储的示例:
DefaultLineMapper<OneRow> lineMapper = new DefaultLineMapper<OneRow>() {
@Override
public OneRow mapLine(String line, int lineNumber) throws Exception {
return new OneRow(lineNumber, line);
}
};
当然你已经可以映射你的Object了,我需要将整行未处理作为我的处理器的输入。
作为具有相同想法的参考:https://stackoverflow.com/a/23770421/5658642