如何针对不同的记录调用合适的项目处理器?

2024-01-15

我有一个包含不同记录的平面文件(页眉、记录和页脚)

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

项目处理器

    @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<Object>我收到异常“无法打开文件”。问题是如何使 ItemProcessor 处理从 Reader 返回的不同记录类型?


您的问题是您在中使用的分类器ClassifierCompositeItemProcessor基于字符串模式而不是类型。真正应该发生的事情是这样的:

读取器根据输入模式返回特定类型的项目,例如:

  • HR* -> HR 类型
  • RD* -> RD 类型
  • FR* -> FR 类型

这基本上就是您在读者方面所做的事情。现在在处理方面,处理器将接收类型的对象HRType, RDType and 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());

该分类器使用Object输入因为你的ItemReader返回原始类型。我会not建议使用原始类型和Object输入分类器。你应该做的是:

  1. 创建项目的基类和每种类型的特定类
  2. 让读者返回类型的项目<? extends BaseClass>
  3. Use a org.springframework.classify.SubclassClassifier在你的ClassifierCompositeItemProcessor
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何针对不同的记录调用合适的项目处理器? 的相关文章

随机推荐