SpringBatch-获取FieldSetMapper上的行号 [英] SpringBatch - Get Line Number on FieldSetMapper

查看:10
本文介绍了SpringBatch-获取FieldSetMapper上的行号的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要将行号放入FieldSet映射器。我如何才能做到这一点?

我要将lineNumber用作映射器生成的结果对象的字段。

<beans:bean id="fileReader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step">
    <beans:property name="resource" 
        value="file:${batch.source}"/>
    <beans:property name="lineMapper">
        <beans:bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
            <beans:property name="lineTokenizer">
                <beans:bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
                    <beans:property name="delimiter" value="${batch.delimiter}"/>
                    <beans:property name="names" value="${batch.columns}"/>
                </beans:bean>
            </beans:property>

            <beans:property name="fieldSetMapper">
                <beans:bean class="my.batch.mapper.ResourceFieldSetMapper"/>
            </beans:property>
        </beans:bean>
    </beans:property>
</beans:bean>

谢谢您。

推荐答案

我意识到,通过使用我自己的LineMapper覆盖DefaultLineMapper,可以将lineNumber值获取到MyObject中:

import org.springframework.batch.item.file.FlatFileParseException;
import org.springframework.batch.item.file.LineMapper;
import org.springframework.batch.item.file.transform.LineTokenizer;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.Assert;

import my.model.MyObject;

public class MyLineMapper<T> implements LineMapper<MyObject>, InitializingBean {

    private LineTokenizer tokenizer;

    private ResourceFieldSetMapper fieldSetMapper;

    public MyObject mapLine(String line, int lineNumber) throws Exception {
        try{
            MyObject r = fieldSetMapper.mapFieldSet(tokenizer.tokenize(line));
            // this is the modification
            r.setLineNumber(lineNumber);
            return r;
        }
        catch(Exception ex){
            throw new FlatFileParseException("Parsing error at line: " + lineNumber + 
                    ", input=[" + line + "]", ex, line, lineNumber); 
        }
    }

    public void setLineTokenizer(LineTokenizer tokenizer) {
        this.tokenizer = tokenizer;
    }

    public void setFieldSetMapper(ResourceFieldSetMapper fieldSetMapper) {
        this.fieldSetMapper = fieldSetMapper;
    }

    public void afterPropertiesSet() {
        Assert.notNull(tokenizer, "The LineTokenizer must be set");
        Assert.notNull(fieldSetMapper, "The FieldSetMapper must be set");
    }

}

谢谢您的帮助!我希望这对某人有用!

祝福!

这篇关于SpringBatch-获取FieldSetMapper上的行号的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆