当前位置: 首页 > 知识库问答 >
问题:

Spring批处理编写器接收到错误的对象类型

全流觞
2023-03-14

我有麻烦与Spring Batch关于配置我的自定义作家这基本上是一个RepositoryItemWriter

@Bean
@StepScope
public ItemReader<DTO> itemReader() {
    [...]Reading from database and mapping into DTO class
    return reader;
}

@Bean
@StepScope
public ItemProcessor<DTO, Entity> itemProcessor(mapper) {
        return dto-> {
            dto.check();
            return mapper.toEntity(dto);
        };
}

@Bean
@StepScope
public ItemWriter<Entity> itemWriter() {
   [...]Save into database from repository
   return writer;
}

@Bean
public Step step() {
    return stepBuilderFactory.get("step")
            .<DTO, Entity>chunk(500)
            .reader(itemReader)
            .writer(itemWriter)
            .build();
}

我使用mapstruct将DTO映射到处理器内的实体。尽管这似乎是正确的,但我的作者实际上接收的是DTO项而不是实体,因此无法持久化它们。

关于批次结构的一些补充但不相关的信息。我从一个大文件中读取,将其分成较小的文件。然后我用多资源分区器分区我的步骤,处理器正在做一些格式控制,然后写入器只是批量插入数据库。

编辑:我想我可以复制/粘贴生成的源代码,但MapperImpl非常简单:

   @Override
    public Entity toEntity(DTO dto) {
        if ( dto == null ) {
            return null;
        }
      Entity entity = new Entity();
      [Bunch of controls and mapping]
      return entity;
     }

差不多就是这样。

谢谢你的帮助

共有2个答案

丌官嘉良
2023-03-14

我猜是因为晚上的编码错误。没有为该步骤声明处理器,因此项直接从读卡器传递到写卡器,而没有作为实体进行处理和转换。

@Bean
@StepScope
public ItemReader<DTO> itemReader() {
    [...]Reading from database and mapping into DTO class
    return reader;
}

@Bean
@StepScope
public ItemProcessor<DTO, Entity> itemProcessor(mapper) {
        return dto-> {
            dto.check();
            return mapper.toEntity(dto);
        };
}

@Bean
@StepScope
public ItemWriter<Entity> itemWriter() {
   [...]Save into database from repository
   return writer;
}

@Bean
public Step step() {
    return stepBuilderFactory.get("step")
            .<DTO, Entity>chunk(500)
            .reader(itemReader)
            .processor(itemProcessor) //Edit with solution : This line was missing
            .writer(itemWriter)
            .build();
}

不过,我仍然想知道它是否应该被编译。

商勇
2023-03-14

返回mapper.to实体(dto);

也许,问题出在mapper实现上。如果没有实现源,很难说mapper是如何工作的

 类似资料:
  • 在我的Spring boot和Spring batch应用程序中,我有这样一个步骤: 我的作家是一个空的,如下所示: 现在,在我的处理器中,我有: 问题:由于所有对象都传递给处理器,我可以在处理器本身中处理它们,而不是使用任何转换等,因为我的目的通过使用处理器来解决,这是一个好的做法吗?或者我必须使用作家/自定义作家来完成工作?

  • (A)ItemReader[第一输入]->(A)ItemProcessor[第一输入]->(B)ItemReader[使用处理过的输入从另一个源收集第二输入]->(B)ItemProcessor[使用处理过的第一输入和第二输入]->{repeat B}->ItemWriter(最终结果) 有没有人知道如何在Spring批处理中这样做?多谢了。

  • 关于skip,我有一个非常基本的问题。我正在使用spring示例提供的spring batch simple cli项目,并试图理解跳过行为。它有一个非常基本的示例读取器,可以读取字符串数组(我将其修改为从Hellowworld 1到Hellowworld 10的10个字符串列表中读取),还有一个基本的编写器,可以登录到控制台。writer抛出java。每写一次都有例外。我在作业配置中增加了4个跳

  • 我开始学习spring batch,遇到一个问题,当我想使用在数据库中持久化作业的状态时。编译器显示: “原因:org.springframework.beans.factory.beanCreationException:创建类路径资源[springconfig.xml]中定义的名为'job repository'的bean时出错:调用init方法失败;嵌套异常为java.lang.noClas

  • 我目前正在编写一个Spring批处理,其中我正在读取一个数据块,并对其进行处理,然后我希望将此数据传递给两个Writer。一个writer将简单地更新数据库,而第二个writer将写入csv文件。 我计划编写自己的自定义编写器,并在customItemWriter中注入这两个ItemWriter,并在customItemWriter的write方法中调用这两个ItemWrite的write方法。这