如何为不同的记录调用适当的项目处理器? [英] How to call appropriate Item Processor for different records?
问题描述
我有一个包含不同记录(页眉、记录和页脚)的平面文件
I have a flat file containing different records(header, record and footer)
HR,...
RD,...
FR,...
物品阅读器
@Bean
@StepScope
public FlatFileItemReader reader(@Value("#{jobParameters['inputFileName']}") String inputFileName) {
FlatFileItemReader reader = new FlatFileItemReader();
reader.setResource(new FileSystemResource(inputFileName));
reader.setLineMapper(patternLineMapper());
return reader;
}
@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;
}
它们工作正常,spring batch 为每条记录调用适当的读取器问题是当涉及到项目处理器时我想使用相同的方法我得到 java.lang.ClassCastException
因为 spring batch尝试将域对象 [从阅读器返回] 映射到 java.lang.String
They are working fine and spring batch calls the appropriate reader for each record the problem is when it comes to item processor I want to use the same approach I get java.lang.ClassCastException
cuz spring batch try to map domain object [returned from reader] to 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;
}
我也使用了 BackToBackPatternClassifier
但结果证明它有一个错误,当我使用像 ItemWriter
这样的泛型时,我得到一个异常无法打开文件.问题是如何制作 ItemProcessor 来处理从 Reader 返回的不同记录类型?
I also used BackToBackPatternClassifier
but it turns out it has a bug and when I use generics like ItemWriter<Object>
I get an exception Couldn't Open File. the question is
How can I make ItemProcessor that handles different record types returned from Reader??
推荐答案
您的问题是您在 ClassifierCompositeItemProcessor
中使用的分类器基于字符串模式而不是类型.真正应该发生的事情是这样的:
Your issue is that the classifier you use in the ClassifierCompositeItemProcessor
is based on a String pattern and not a type. What really should happen is something like:
阅读器根据输入模式返回特定类型的项目,例如:
The reader returns a specific type of items based on the input pattern, something like:
- HR* -> HRType
- RD* -> RDType
- FR* -> FRType
这就是您在读者方面所做的基本工作.现在在处理端,处理器将接收 HRType
、RDType
和 FRType
类型的对象.所以分类器不应该基于String作为输入类型,而是基于项目类型,比如:
This is what you have basically done on the reader side. Now on the processing side, the processor will receive objects of type HRType
, RDType
and FRType
. So the classifier should not be based on String as input type, but on the item type, something like:
Map<Object, ItemProcessor> patternMap = new HashMap<>();
patternMap.put(HRType.class, new HeaderItemProcessor());
patternMap.put(RDType.class, new RecordItemProcessor());
patternMap.put(FRType.class, new FooterItemProcessor());
此分类器使用 Object
类型,因为您的 ItemReader
返回原始类型.我不建议在分类器中使用原始类型和Object
类型.你应该做的是:
This classifier uses Object
type because your ItemReader
returns a raw type. I would not recommend using raw types and Object
type in the classifier. What you should do is:
- 为您的项目创建一个基类,并为每种类型创建一个特定的类
- 让阅读器返回
- 在您的
ClassifierCompositeItemProcessor
中使用
org.springframework.classify.SubclassClassifier
这篇关于如何为不同的记录调用适当的项目处理器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!