1

我正在创建一个作业,它将根据输入参数读取和处理不同的 .csv 文件。有 3 种不同类型的 .csv 文件,它们具有不同的标题。我想使用通用的将文件的每一行映射到 POJO FlatFileItemReader

每种类型的文件都有自己的 POJO 实现,所有“文件特定 POJO”都是从 abstract 子类化的GenericFilePOJO

tasklet 将首先读取输入参数以决定需要读取哪种文件类型,并构造一个带有适当标题列的 LineTokenizer。它将这些信息放在 infoHolder 中,以便在阅读器步骤中检索。

@Bean
public FlatFileItemReader<GenericFilePOJO> reader() {
    FlatFileItemReader<RawFile> reader = new FlatFileItemReader<GenericFilePOJO>();
    reader.setLinesToSkip(1); // header

    reader.setLineMapper(new DefaultLineMapper() {
        {
            // The infoHolder will contain the file-specific LineTokenizer
            setLineTokenizer(infoHolder.getLineTokenizer());
            setFieldSetMapper(new BeanWrapperFieldSetMapper<GenericFilePOJO>() {
                {
                    setTargetType(GenericFilePOJO.class);
                }
            });
        }
    });
    return reader;
}

尽管返回了GenericFilePOJO?

4

1 回答 1

2

你写了:

Atasklet将首先读取输入参数来决定需要读取哪种文件类型。

因为taskletorinfoHolder知道文件的类型,您可以实现特定FieldSetMapper实例的创建。

这是一个演示示例,如何实现它:

public class Solution<T extends GenericFilePOJO> {
    private InfoHolder infoHolder = new InfoHolder();

    @Bean
    public FlatFileItemReader<T> reader()
    {
        FlatFileItemReader<T> reader = new FlatFileItemReader<T>();
        reader.setLinesToSkip(1);

        reader.setLineMapper(new DefaultLineMapper() {
            {
                setLineTokenizer(infoHolder.getLineTokenizer());
                setFieldSetMapper(infoHolder.getFieldSetMapper());
            }
        });
        return reader;
    }

    private class InfoHolder {
        DelimitedLineTokenizer getLineTokenizer() {
            return <some already existent logic>;
        }

        FieldSetMapper<T> getFieldSetMapper() {
            if (some condition for specific file POJO 1){
                return new BeanWrapperFieldSetMapper<T>() {
                    {
                        setTargetType(FileSpecificPOJO_1.class);
                    }
                };
            } else if (some condition for specific file POJO 2){
                return new BeanWrapperFieldSetMapper<T>() {
                    {
                        setTargetType(FileSpecificPOJO_2.class);
                    }
                };
            }
        }
    }
}
于 2020-01-01T00:06:21.987 回答