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

dSh*_*ngi 7 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);
Run Code Online (Sandbox Code Playgroud)

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

Ser*_*gio 3

如果我正确理解了这个问题,您希望两个不同的列具有不同的日期格式(而不是不同的行具有不同的格式)。您可以通过实现 FieldSetMapper 来做到这一点,如文档中所述。

@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;
}
Run Code Online (Sandbox Code Playgroud)

执行:

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;
}
Run Code Online (Sandbox Code Playgroud)

}