Spring batch 在SpringBatch(自定义映射器)中,是否有一种基于列名的映射方法?

Spring batch 在SpringBatch(自定义映射器)中,是否有一种基于列名的映射方法?,spring-batch,flatfilereader,Spring Batch,Flatfilereader,在定制映射器中,无论我在哪里检查,映射都是基于列索引完成的。有没有办法根据列名获取数据 因此,假设我需要读取一个包含10列的.csv文件,而我只需要少于5列 <bean id="ReportReader" class="org.springframework.batch.item.file.FlatFileItemReader"> <property name="linesToSkip" value="1" /> <property name="re

在定制映射器中,无论我在哪里检查,映射都是基于列索引完成的。有没有办法根据列名获取数据

因此,假设我需要读取一个包含10列的.csv文件,而我只需要少于5列

<bean id="ReportReader" class="org.springframework.batch.item.file.FlatFileItemReader">
    <property name="linesToSkip" value="1" />
    <property name="resource" value="classpath:rawdata/file.csv" />
    <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="strict" value="False" />
                    <property name="names">
                        <array>
                            <value>columnName1</value>
                            <value>columnName2</value>
                            <value>columnName3</value>
                            <value>columnName4</value>
                            <value>columnName5</value>
                        </array>
                    </property>
                </bean>
            </property>
            <property name="fieldSetMapper">
                <bean
                    class="org.springframework.batch.item.file.mapping.PropertiesFieldSetMapper">
                </bean>
            </property>
        </bean>
    </property>
</bean>

专栏名称1
专栏名称2
专栏名称3
专栏名称4
专栏名称5
目前,我已经创建了一个泛型PropertiesFieldSetMapper类,我也将其用于其他作业

public class PropertiesFieldSetMapper implements FieldSetMapper<Properties> {

@Override
public Properties mapFieldSet(FieldSet fieldSet) throws BindException {

    Properties properties = fieldSet.getProperties();

    return properties;
}
公共类属性FieldSetMapper实现FieldSetMapper{
@凌驾
公共属性映射字段集(字段集字段集)引发BindException{
Properties=fieldSet.getProperties();
归还财产;
}
}

现在,如果只有5列且顺序相同,则上述代码集可以正常工作。当列增加时,代码失败。为此,我们可以实现自定义映射器

public class PropertiesFieldSetMapper implements FieldSetMapper<Properties> {

@Override
public Properties mapFieldSet(FieldSet fieldSet) throws BindException {

    //Properties properties = fieldSet.getProperties();

    Properties properties = new Properties();
    properties.setProperty("columnName1", fieldSet.readString(0));
    properties.setProperty("columnName2", fieldSet.readString(1));
    properties.setProperty("columnName3", fieldSet.readString(2));
    properties.setProperty("columnName4", fieldSet.readString(3));
    properties.setProperty("columnName5", fieldSet.readString(4));

    return properties;
}
公共类属性FieldSetMapper实现FieldSetMapper{
@凌驾
公共属性映射字段集(字段集字段集)引发BindException{
//Properties=fieldSet.getProperties();
属性=新属性();
properties.setProperty(“columnName1”,fieldSet.readString(0));
properties.setProperty(“columnName2”,fieldSet.readString(1));
properties.setProperty(“columnName3”,fieldSet.readString(2));
properties.setProperty(“columnName4”,fieldSet.readString(3));
properties.setProperty(“columnName5”,fieldSet.readString(4));
归还财产;
}
}

在上面的代码中,我已经完成了基于列索引的映射。但如果列的顺序发生变化,这也会失败。因此,为了使其健壮,我希望通过名称而不是列索引来映射它


有没有办法做到这一点??提前感谢。

这是否回答了您的问题?谢谢@MahmoudBenHassine,但即使是我也希望映射基于列而不是索引。另外,当我只在没有includedField标记的批处理作业xml文件中提供名称(我感兴趣)时,我在自定义映射器类中获得的字段集不一致,即名称和值不匹配。当我在xml文件中不传递任何名称时,字段集只提供标记化值,而不提供名称。因此,我不能做任何操作,因为它说元数据不可用。同样,我能做的是根据我不想要的索引获取值。在这种情况下,你需要一个自定义映射器。