Ham*_*ada 5 spring spring-batch spring-boot
我有一个包含不同记录的平面文件(页眉、记录和页脚)
HR,...
RD,...
FR,...
Run Code Online (Sandbox Code Playgroud)
项目阅读器
@Bean
@StepScope
public FlatFileItemReader reader(@Value("#{jobParameters['inputFileName']}") String inputFileName) {
FlatFileItemReader reader = new FlatFileItemReader();
reader.setResource(new FileSystemResource(inputFileName));
reader.setLineMapper(patternLineMapper());
return reader;
}
Run Code Online (Sandbox Code Playgroud)
@Bean
public LineMapper patternLineMapper() {
PatternMatchingCompositeLineMapper patternLineMapper = new PatternMatchingCompositeLineMapper<>();
tokenizers = new HashMap<String, LineTokenizer>();
try {
tokenizers.put("HR*", headerLineTokenizer());
tokenizers.put("RD*", recordLineTokenizer());
tokenizers.put("FR*", footerLineTokenizer());
} catch (Exception e) {
e.printStackTrace();
}
fieldSetMappers = new HashMap<String, FieldSetMapper>();
fieldSetMappers.put("HR*", new HeaderFieldSetMapper());
fieldSetMappers.put("RD*", new RecordFieldSetMapper());
fieldSetMappers.put("FR*", new FooterFieldSetMapper());
patternLineMapper.setTokenizers(tokenizers);
patternLineMapper.setFieldSetMappers(fieldSetMappers);
return patternLineMapper;
}
Run Code Online (Sandbox Code Playgroud)
它们工作正常,并且 Spring Batch 为每个记录调用适当的读取器,问题是当涉及到项目处理器时,我想使用与我得到的相同的方法,java.lang.ClassCastException因为 Spring Batch 尝试将域对象 [从读取器返回] 映射到java.lang.String
项目处理器
@Bean
@StepScope
public ItemProcessor processor() {
ClassifierCompositeItemProcessor processor = new ClassifierCompositeItemProcessor();
PatternMatchingClassifier<ItemProcessor> classifier = new PatternMatchingClassifier<>();
Map<String, ItemProcessor> patternMap = new HashMap<>();
patternMap.put("HR*", new HeaderItemProcessor());
patternMap.put("RD*", new RecordItemProcessor());
patternMap.put("FR*", new FooterItemProcessor());
classifier.setPatternMap(patternMap);
processor.setClassifier(classifier);
return processor;
}
Run Code Online (Sandbox Code Playgroud)
我也使用过BackToBackPatternClassifier,但事实证明它有一个错误,当我使用像这样的泛型时,ItemWriter<Object>我得到一个异常“无法打开文件”。问题是
如何使 ItemProcessor 处理从 Reader 返回的不同记录类型?
您的问题是您在中使用的分类器ClassifierCompositeItemProcessor基于字符串模式而不是类型。真正应该发生的事情是这样的:
读取器根据输入模式返回特定类型的项目,例如:
这基本上就是您在读者方面所做的事情。现在在处理方面,处理器将接收类型为HRType、RDType和的对象FRType。因此分类器不应基于 String 作为输入类型,而应基于项目类型,例如:
Map<Object, ItemProcessor> patternMap = new HashMap<>();
patternMap.put(HRType.class, new HeaderItemProcessor());
patternMap.put(RDType.class, new RecordItemProcessor());
patternMap.put(FRType.class, new FooterItemProcessor());
Run Code Online (Sandbox Code Playgroud)
该分类器使用Object类型,因为您ItemReader返回原始类型。我不Object建议在分类器中使用原始类型和类型。你应该做的是:
<? extends BaseClass>org.springframework.classify.SubclassClassifier你的ClassifierCompositeItemProcessor| 归档时间: |
|
| 查看次数: |
1481 次 |
| 最近记录: |