我有不同的导入作业,可将数据导入我们的系统。由于数据来自不同的生产者,所以有时我会得到csv数据或不同格式的xml。这些导入类型中的每一个都有自己的带有其配置的spring批处理作业(不同的读取器,不同的处理器但都相同的写入器)。
我现在的任务是,我不仅需要转换后的对象,而且还需要系统中的“原始数据”。因此,对于csv导入,我希望能够访问建立一个实体的原始行。在XML中,我希望原始元素为字符串。因此,编写器应该扩展为采用我的转换对象DTO以及带有已读取原始数据的附加字符串。
我只是想不出如何用Spring Batch访问原始数据。我尝试了几种方法来使用ItemReadListener#beforeRead或afterRead进入处理行,但无法访问文件中的原始数据。
关于我可以进一步了解的任何想法?或有关如何实现获取原始数据和转换后的dto对象的提示?
您不必将数据映射到域对象,您的项目可以是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