Spring Batch + Spring Boot + Couchbase

Я пытаюсь создать тасклет и писать в couchbase.

@Configuration
@EnableBatchProcessing
public class BatchConfiguration extends 
   DefaultBatchConfigurer {
@Autowired
private JobBuilderFactory jobBuilders;

@Autowired
private StepBuilderFactory stepBuilders;

  @Bean
public Step updatedatabaseStep(){
return stepBuilders.get("updatedatabaseStep").tasklet(new UpdateLocalDbStep()).build();}

Мой шаг

public class UpdateLocalDbStep implements Tasklet, StepExecutionListener {
@Autowired
private CouchBaseRepository 
   couchBaseRepository;
  @Override
public RepeatStatus execute(StepContribution arg0, ChunkContext chunkContext) throws Exception {
couchBaseRepository.save(this.table);
return RepeatStatus.FINISHED;
}

Мой сервис Couchbase

@Repository
@N1qlPrimaryIndexed
@ViewIndexed(designDoc = "ownerDetails")
public class CouchBaseRepository {}

Каждый раз, когда я получаю исключение с нулевым указателем, когда выполняю шаг, в котором указано, что CouchBaseRepository имеет значение NULL

2018-11-12 18:59:10.435  INFO 56531 --- [                   
main] c.p.r.s.impl.steps.UpdateLocalDbStep     
: Updating local db with lated table 
info_incr
2018-11-12 18:59:10.440 ERROR 56531 --- [           
main] o.s.batch.core.step.AbstractStep         
: Encountered an error executing step 
updatedatabaseStep in job findOwnerJob

java.lang.NullPointerException: null
at 

com.restbatchApi.service.impl.steps.UpdateLocalDbStep.execute (UpdateLocalDbStep.java:58) ~ [классы /: нет данных] в org.springframework.batch.core.step.tasklet.TaskletStep $ ChunkTransactionCallback.doInTransaction (TaskletStep.java:407) ~ [spring-batch-core-4.1.0.RELEASE.jar: 4.1.0.RELEASE] в org.springframework.batch.core.step.tasklet.TaskletStep $ ChunkTransactionCallback.doInTransaction (TaskletStep.java:331) ~ [spring-batch-core-4.1.0.RELEASE.jar: 4.1.0.RELEASE] в org.springframework.transaction.support.TransactionTemplate.execute (TransactionTemplate.java:140) ~ [spring-tx-5.1.2.RELEASE.jar: 5.1.2.RELEASE]

Нам нужно выполнить некоторую пакетную обработку, и я только начал понимать Spring-Batch. Еще у нас есть диван-база db. Насколько я понял, spring-batch из коробки не поддерживает диван. С какими трудностями вы столкнулись при работе с пружинным пакетом + кушеткой. Также как вы обрабатывали bean-компонент репозитория вакансий и особенно диспетчер транзакций (поскольку в couchbase нет концепции транзакций).

humbleCoder 31.12.2018 12:15
1
1
508
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы создаете тасклет с new UpdateLocalDbStep(), поэтому этот экземпляр не управляется контейнером Spring и, следовательно, зависимости этого объекта не будут внедрены.

Вам нужно объявить тасклет как bean-компонент:

@Bean
public Tasklet tasklet() {
   return new UpdateLocalDbStep();
}

и обратитесь к нему в определении вашего шага:

@Bean
public Step updatedatabaseStep(){
   return stepBuilders.get("updatedatabaseStep").tasklet(tasklet()).build();
}

В качестве побочного примечания я бы рекомендовал внедрение конструктора для вашего тасклета (создание конструктора с CouchBaseRepository в качестве параметра).

Спасибо @Mahmoud Ben Hassine

Odin 12.11.2018 18:19

Другие вопросы по теме