Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 如何为不同的记录调用相应的项目处理程序?_Spring Boot_Spring Batch - Fatal编程技术网

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());