如何在Spring Batch作业(xml或csv)中访问读取的原始数据

问题描述 投票:-2回答:1

我有不同的导入作业,可将数据导入我们的系统。由于数据来自不同的生产者,所以有时我会得到csv数据或不同格式的xml。这些导入类型中的每一个都有自己的带有其配置的spring批处理作业(不同的读取器,不同的处理器但都相同的写入器)。

我现在的任务是,我不仅需要转换后的对象,而且还需要系统中的“原始数据”。因此,对于csv导入,我希望能够访问建立一个实体的原始行。在XML中,我希望原始元素为字符串。因此,编写器应该扩展为采用我的转换对象DTO以及带有已读取原始数据的附加字符串。

我只是想不出如何用Spring Batch访问原始数据。我尝试了几种方法来使用ItemReadListener#beforeRead或afterRead进入处理行,但无法访问文件中的原始数据。

关于我可以进一步了解的任何想法?或有关如何实现获取原始数据和转换后的dto对象的提示?

java spring spring-batch
1个回答
0
投票

您不必将数据映射到域对象,您的项目可以是String类型。

对于平面文件,您可以使用PassThroughLineMapper逐字显示原始行:

@Bean
public FlatFileItemReader<String> itemReader() {
    return new FlatFileItemReaderBuilder<String>()
            .name("rawDataReader")
            .resource(new FileSystemResource("/absolute/path/to/your/flat/file"))
            .lineMapper(new PassThroughLineMapper())
            .build();
}

对于XML文件,可以对StaxEventItemReader<String>使用相同的方法。但是,Spring Batch将解组过程委托给org.springframework.oxm.Marshaller,因此根据您使用的XML实现,您需要相应地配置解组器:

@Bean
public StaxEventItemReader<String> itemReader() {
    Marshaller marshaller = .. // create or inject marshaller
    // configure marshaller to unmarshal raw strings
    return new StaxEventItemReaderBuilder<String>()
            .name("rawXmlDataReader")
            .resource(new FileSystemResource("/absolute/path/to/your/xml/file"))
            .addFragmentRootElements("yourTagName")
            .unmarshaller(marshaller)
            .build();
}

对于Jaxb,这可能会有所帮助:JAXB use String as it is

© www.soinside.com 2019 - 2024. All rights reserved.