4

我正在使用弹簧批处理来解析我的文件。在 ItemProcessor 中,我验证传入字段是否正确。如果不是,我想抛出 ValidationException 并将具有不正确字段的相应行记录到文件中。那么,如何在 ItemProcessor 中找到行数和文件名?

4

2 回答 2

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。这包括行号,可以在侦听器中处理。

于 2013-03-01T13:33:57.110 回答
0

至于行号,您可以构建自己的 LineMapper,然后将行号存储在您的业务对象中。我将未处理的行(原样)与行号一起存储的示例:

    DefaultLineMapper<OneRow> lineMapper = new DefaultLineMapper<OneRow>() {
        @Override
        public OneRow mapLine(String line, int lineNumber) throws Exception {
            return new OneRow(lineNumber, line);
        }
    };

当然,您已经可以映射您的对象,我需要将整行未经处理作为我的处理器的输入。

作为具有相同想法的参考:https ://stackoverflow.com/a/23770421/5658642

于 2016-08-30T08:47:40.037 回答