Spring Batch Writer получает неправильный тип объекта - PullRequest
1 голос
/ 27 мая 2020

У меня проблемы с 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 с Entity внутри процессора. Несмотря на то, что это кажется правильным, мой писатель фактически получает элементы DTO вместо Entity и поэтому не может их сохранять.

Некоторая дополнительная, но не относящаяся к делу информация о структуре партии. Я читаю из большого файла, разбивая его на файлы меньшего размера. Затем я делю свой шаг с помощью разделителя с несколькими ресурсами, процессор выполняет несколько элементов управления форматом, затем писатель просто пакетно вставляет его в базу данных.

Изменить: я думаю, я мог бы скопировать / вставить созданный источник, но MapperImpl довольно прост:

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

Вот и все.

Спасибо за вашу помощь

Ответы [ 2 ]

0 голосов
/ 27 мая 2020

Думаю, ошибка из-за ночного кодирования. Процессор не был объявлен для шага, поэтому элементы передавались напрямую от читателя к писателю, не обрабатывались и не преобразовывались как сущности.

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

Тем не менее, все еще сомневаюсь, что он должен был скомпилироваться.

0 голосов
/ 27 мая 2020

return mapper.toEntity (dto);

Возможно, проблема в реализации маппера. Трудно сказать, как работает mapper без исходного кода реализации

...