В Spring Batch, Custom Mapper, есть ли способ сопоставления на основе имен столбцов? - PullRequest
0 голосов
/ 24 февраля 2020

В Custom Mapper везде, где я проверял, сопоставление выполняется на основе индекса столбца. Есть ли способ, которым мы можем получить данные на основе имен столбцов?

Итак, предположим, мне нужно прочитать CSV-файл с 10 столбцами, а мне нужно только пять столбцов.

<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>

В настоящее время я создал обобщенный класс c PropertiesFieldSetMapper, который я использую и для других заданий.

public class PropertiesFieldSetMapper implements FieldSetMapper<Properties> {

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

    Properties properties = fieldSet.getProperties();

    return properties;
}

}

Теперь вышеприведенный набор кода работает нормально, если есть только 5 столбцов и в том же порядке. Когда столбец увеличивается, код не работает. Для этого мы можем реализовать Custom Mapper.

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;
}

}

В приведенном выше коде я сделал отображение на основе индекса столбца. Но и это не помогает, если порядок столбцов меняется. Таким образом, чтобы сделать его устойчивым, я хочу отобразить его с помощью имен, а не индекса столбца.

Есть ли способ добиться этого ?? Заранее спасибо.

...