Spring boot 如何为不同的记录调用相应的项目处理程序?
我有一个包含不同记录(页眉、记录和页脚)的平面文件 项目阅读器Spring boot 如何为不同的记录调用相应的项目处理程序?,spring-boot,spring-batch,Spring Boot,Spring Batch,我有一个包含不同记录(页眉、记录和页脚)的平面文件 项目阅读器 @Bean @StepScope public FlatFileItemReader reader(@Value("#{jobParameters['inputFileName']}") String inputFileName) { FlatFileItemReader reader = new FlatFileItemReader(); reader.setResource
@Bean
@StepScope
public FlatFileItemReader reader(@Value("#{jobParameters['inputFileName']}") String inputFileName) {
FlatFileItemReader reader = new FlatFileItemReader();
reader.setResource(new FileSystemResource(inputFileName));
reader.setLineMapper(patternLineMapper());
return reader;
}
我还使用了backtobackpatternsider
,但结果发现它有一个bug,当我使用像ItemWriter
这样的泛型时,我得到一个异常,无法打开文件。问题是
如何使ItemProcessor处理从读卡器返回的不同记录类型???您的问题是在
分类器组件处理器中使用的分类器基于字符串模式,而不是类型。真正应该发生的是:
Map<Object, ItemProcessor> patternMap = new HashMap<>();
patternMap.put(HRType.class, new HeaderItemProcessor());
patternMap.put(RDType.class, new RecordItemProcessor());
patternMap.put(FRType.class, new FooterItemProcessor());
读取器根据输入模式返回特定类型的项,如:
Map<Object, ItemProcessor> patternMap = new HashMap<>();
patternMap.put(HRType.class, new HeaderItemProcessor());
patternMap.put(RDType.class, new RecordItemProcessor());
patternMap.put(FRType.class, new FooterItemProcessor());
- HR*->HRType
- RD*->RDType
- FR*->FRType
这是您在读者端基本上所做的。现在在处理端,处理器将接收类型为HRType
、RDType
和FRType
的对象。因此,分类器不应基于字符串作为输入类型,而应基于项类型,例如:
Map<Object, ItemProcessor> patternMap = new HashMap<>();
patternMap.put(HRType.class, new HeaderItemProcessor());
patternMap.put(RDType.class, new RecordItemProcessor());
patternMap.put(FRType.class, new FooterItemProcessor());
Map patternMap=newhashmap();
patternMap.put(HRType.class,新的HeaderItemProcessor());
patternMap.put(RDType.class,newRecordItemProcessor());
patternMap.put(FRType.class,new FooterItemProcessor());
此分类器使用Object
类型,因为ItemReader
返回原始类型。我不建议在分类器中使用原始类型和对象类型。你应该做的是:
创建项目的基类和每种类型的特定类
使读取器返回类型为的项,这是我想要确定的,我不能将模式匹配分类器
与类型对象一起使用,因为它希望得到java.lang.String
@Mahmoud
Map<Object, ItemProcessor> patternMap = new HashMap<>();
patternMap.put(HRType.class, new HeaderItemProcessor());
patternMap.put(RDType.class, new RecordItemProcessor());
patternMap.put(FRType.class, new FooterItemProcessor());