BeanWrapperFieldsetMapper以每个字段为基础映射PropertyEditor

时间:2015-06-16 09:41:48

标签: java spring spring-batch

我使用spring批处理文件进行数据库处理,目前我正在使用PropertyEditors将分隔文件中的字符串转换为某个对象,如下所示。

Map<Class<?>, PropertyEditor> editors = new HashMap<>();
CustomDateEditor dateEditor = new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true);
editors.put(Date.class, dateEditor);

因此,如果我有一个Date字段,我使用CustomDateEditor并成功解析给定的格式日期字符串。但是,如果我在同一个文件中有更多日期字符串,格式不同,我就无法解析它们。我需要的是将编辑器与字段相关联,那么我有办法做到这一点吗?

1 个答案:

答案 0 :(得分:1)

如果我正确理解了这个问题,您希望两个不同的列具有不同的日期格式(不同的行具有不同的格式)。您可以通过实现FieldSetMapper来实现,如docs

中所述
@Bean
public FlatFileItemReader<Person> secondReader() {
    FlatFileItemReader<Person> reader = new FlatFileItemReader<Person>();
    reader.setResource(new ClassPathResource("sample-data2.csv"));
    reader.setLineMapper(new DefaultLineMapper<Person>() {
        {
            setLineTokenizer(new DelimitedLineTokenizer() {
                {
                    setNames(new String[] { "firstName", "lastName", "fDate", "sDate" });
                }
            });
            setFieldSetMapper(new PersonMapper());
        }
    });
    return reader;
}

实现:

public class PersonMapper implements FieldSetMapper<Person> {

@Override
public Person mapFieldSet(FieldSet fieldSet) throws BindException {
    Person person = new Person();
    person.setFirstName(fieldSet.readString("firstName"));
    person.setLastName(fieldSet.readString("lastName"));
    person.setFirstDate(fieldSet.readDate("fDate", "MM/dd/yyyy"));
    person.setSecondDate(fieldSet.readDate("sDate", "dd-MMM-yyyy"));
    return person;
}

}