2017-10-19 8 views
1

Je reçois un NPE lorsque j'essaie de gérer automatiquement un bean dans ItemReader. Est-ce que quelqu'un peut m'aider avec où je vais mal? Merci!Spring Boot + Batch: Les beans injectés/autowired sont null dans ItemReader

L'exigence est que je voudrais injecter un DAO dans ItemReader pour récupérer des données de plusieurs sources et créer un seul objet.

C'est la classe de configuration que j'ai -

@Configuration 
@EnableBatchProcessing 
@EnableScheduling 
@EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class }) 
public class ReportMetadataConfig { 

    @Autowired 
    private JobBuilderFactory jobBuilderFactory; 

    @Autowired 
    private StepBuilderFactory stepBuilderFactory; 

    @Autowired 
    private JobLauncher jobLauncher; 

    @Autowired 
    private Job fetchReportMetadataJob; 

    @Bean 
    public Job fetchReportMetadataJob() { 
     return jobBuilderFactory.get("fetchReportMetadataJob") 
       .incrementer(new RunIdIncrementer()).listener(listener()) 
       .flow(reportWriterStep()).end().build(); 
    } 

    @Bean 
    public Step reportWriterStep() { 
     return stepBuilderFactory.get("reportWriterStep").<ReportMetadataDTO, ReportMetadataDTO> chunk(1) 
       .reader(compositeItemReader()) 
       .processor(new ReportMetadataProcessor()) 
       .writer(reportMetadataWriter()).build(); 
    } 

    public ItemReader<ReportMetadataDTO> compositeItemReader() { 
     return new CompositeItemReader(); 
    } 

    public ItemWriter<ReportMetadataDTO> reportMetadataWriter() { 
     return new ReportMetadataWriter(); 
    } 

    @Bean 
    public JobExecutionListener listener() { 
     return new ReportMetadataCompletionListener(); 
    } 

    @Bean 
    public ResourcelessTransactionManager transactionManager() { 
     return new ResourcelessTransactionManager(); 
    } 


} 

C'est le ItemReader composite que j'ai créé -

@Component 
public class CompositeItemReader implements ItemReader<ReportMetadataDTO> { 

    private ItemReader<String> recordReader; 

    @Autowired 
    private ReportMetadataService reportMetadataService; 

    @Override 
    public ReportMetadataDTO read() throws Exception, UnexpectedInputException, ParseException, 
      NonTransientResourceException { 

     reportMetadataService.getReportMetada(); 
     /*if(recordReader == null) { 
      recordReader = new IteratorItemReader<String>(getRecords()); 
     }*/ 
     ReportMetadataDTO data = new ReportMetadataDTO(); 
     //return recordReader.read(); 
     return data; 
    } 

} 

C'est le service que je voudrais appeler ce qui est Autowired dans ItemReader.

@Service 
public class ReportMetadataServiceImpl implements ReportMetadataService { 

    @Autowired 
    private ReportMetadataDao reportMetadataDao; 

    @Override 
    public void getReportMetada() { 
     reportMetadataDao.getReportDetails(); 
    } 

} 

Edition -

Stack Trace -

java.lang.NullPointerException: null 
    at com.test.batch.jobs.ReportMetadata.step.CompositeItemReader.read(CompositeItemReader.java:40) 
    at com.test.batch.jobs.ReportMetadata.step.CompositeItemReader.read(CompositeItemReader.java:1) 
    at org.springframework.batch.core.step.item.SimpleChunkProvider.doRead(SimpleChunkProvider.java:91) 
    at org.springframework.batch.core.step.item.SimpleChunkProvider.read(SimpleChunkProvider.java:157) 
    at org.springframework.batch.core.step.item.SimpleChunkProvider$1.doInIteration(SimpleChunkProvider.java:116) 
    at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:374) 
    at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215) 
    at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:144) 
    at org.springframework.batch.core.step.item.SimpleChunkProvider.provide(SimpleChunkProvider.java:110) 
    at org.springframework.batch.core.step.item.ChunkOrientedTasklet.execute(ChunkOrientedTasklet.java:69) 
    at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:406) 
    at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:330) 
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133) 
    at org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:271) 
    at org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:81) 
    at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:374) 
    at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215) 
    at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:144) 
    at org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:257) 
    at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:200) 
    at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:148) 
    at org.springframework.batch.core.job.flow.JobFlowExecutor.executeStep(JobFlowExecutor.java:64) 
    at org.springframework.batch.core.job.flow.support.state.StepState.handle(StepState.java:67) 
    at org.springframework.batch.core.job.flow.support.SimpleFlow.resume(SimpleFlow.java:169) 
    at org.springframework.batch.core.job.flow.support.SimpleFlow.start(SimpleFlow.java:144) 
    at org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:134) 
    at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:306) 
    at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:135) 
    at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50) 
    at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:128) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
    at org.springframework.batch.core.configuration.annotation.SimpleBatchConfiguration$PassthruAdvice.invoke(SimpleBatchConfiguration.java:127) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) 
    at com.sun.proxy.$Proxy74.run(Unknown Source) 
    at org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.execute(JobLauncherCommandLineRunner.java:214) 
    at org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.executeLocalJobs(JobLauncherCommandLineRunner.java:231) 
    at org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.launchJobFromProperties(JobLauncherCommandLineRunner.java:123) 
    at org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.run(JobLauncherCommandLineRunner.java:117) 
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:776) 
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:760) 
    at org.springframework.boot.SpringApplication.afterRefresh(SpringApplication.java:747) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1162) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1151) 
    at com.test.CustomReportWriterApplication.main(CustomReportWriterApplication.java:12) 
+0

Ce n'est pas un '@ Bean'. –

+0

J'ai essayé de créer Bean dans le fichier de configuration pour le service mais il lance toujours le même NPE. @Bean \t public ReportMetadataService reportMetadataService() { \t \t return new ReportMetadataServiceImpl(); \t} – Zuke

+0

S'il vous plaît fournir la pile trace –

Répondre

1

Vous n'êtes pas correctement câblez votre haricot. Vous voulez soit utiliser @Component sur votre classe et laissez Spring le créer ou ajouter @Bean sur la méthode d'usine et vous le créez. Dans ce cas, vous avez @Component donc vous obtenez une instance que Spring connaît, mais ce n'est pas celle que vous injectez dans votre ItemReader. Celui que vous injectez dans votre ItemReader est un simple qui n'est pas autowired (puisque le printemps ne le sait pas). Je recommande de supprimer le @Component de votre CompositeItemReader et d'ajouter @Bean à public ItemReader<ReportMetadataDTO> compositeItemReader().

+0

A fait exactement cela et cela a fonctionné. Mon mauvais, n'a pas vu cela plus tôt. Merci! – Zuke