Comment accéder aux parameters du job depuis ItemReader, dans Spring Batch?

Cela fait partie de mon job.xml :

        

Ceci est le lecteur de l’article:

 import org.springframework.batch.item.ItemReader; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component("foo-reader") public final class MyReader implements ItemReader { @Override public MyData read() throws Exception { //... } @Value("#{jobParameters['fileName']}") public void setFileName(final Ssortingng name) { //... } } 

Voici ce que Spring Batch dit en runtime:

 Field or property 'jobParameters' cannot be found on object of type 'org.springframework.beans.factory.config.BeanExpressionContext' 

Qu’est-ce qui ne va pas ici? Où puis-je en savoir plus sur ces mécanismes dans Spring 3.0?

Comme il a été dit, votre lecteur doit être “pas à pas”. Vous pouvez le faire via l’ @Scope("step") . Cela devrait fonctionner pour vous si vous ajoutez cette annotation à votre lecteur, comme suit:

 import org.springframework.batch.item.ItemReader; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component("foo-reader") @Scope("step") public final class MyReader implements ItemReader { @Override public MyData read() throws Exception { //... } @Value("#{jobParameters['fileName']}") public void setFileName(final Ssortingng name) { //... } } 

Cette étendue n’est pas disponible par défaut, mais le sera si vous utilisez l’espace de noms XML par batch . Si vous ne l’êtes pas, en ajoutant ce qui suit à votre configuration Spring, la scope sera disponible, conformément à la documentation de Spring Batch :

  

Pour pouvoir utiliser les parameters JobParameters, je pense que vous devez définir votre lecteur comme une «étape», mais je ne suis pas sûr que vous puissiez le faire en utilisant des annotations.

En utilisant xml-config, cela irait comme ceci:

    

Voir plus loin la documentation du lot de spring .

Peut-être que cela fonctionne en utilisant @Scope et en définissant la scope de l’étape dans votre xml-config:

  

Assez tard, mais vous pouvez aussi le faire en annotant une méthode @BeforeStep:

 @BeforeStep public void beforeStep(final StepExecution stepExecution) { JobParameters parameters = stepExecution.getJobExecution().getJobParameters(); //use your parameters } 

Si vous souhaitez définir votre instance ItemReader et votre instance Step dans une seule classe JavaConfig. Vous pouvez utiliser les @StepScope et @Value telles que:

 @Configuration public class ConsortingbutionCardBatchConfiguration { private static final Ssortingng WILL_BE_INJECTED = null; @Bean @StepScope public FlatFileItemReader consortingbutionCardReader(@Value("#{jobParameters['fileName']}")Ssortingng consortingbutionCardCsvFileName){ .... } @Bean Step ingestConsortingbutionCardStep(ItemReader reader){ return stepBuilderFactory.get("ingestConsortingbutionCardStep") .chunk(1) .reader(consortingbutionCardReader(WILL_BE_INJECTED)) .writer(consortingbutionCardWriter()) .build(); } } 

L’astuce consiste à transmettre une valeur nulle à l’itemReader puisqu’il sera injecté via l’ @Value("#{jobParameters['fileName']}") .

Merci à Tobias Flohre pour son article: Spring Batch 2.2 – JavaConfig Part 2: JobParameters, ExecutionContext et StepScope

Lors de l’exécution du travail, nous devons transmettre les parameters du travail comme suit:

 JobParameters jobParameters= new JobParametersBuilder().addSsortingng("file.name", "filename.txt").toJobParameters(); JobExecution execution = jobLauncher.run(job, jobParameters); 

en utilisant le langage d’expression, nous pouvons importer la valeur comme suit:

  #{jobParameters['file.name']} 

En complément d’un exemple supplémentaire, vous pouvez accéder à tous les parameters du travail dans la classe JavaConfig:

 @Bean @StepScope public ItemStreamReader reader(@Value("#{jobParameters}") Map jobParameters){ .... } 

Avez-vous déclaré les parameters de travail comme une carte correctement en tant que bean?

Ou avez-vous peut-être instancié accidentellement un object JobParameters , qui n’a pas de getter pour le nom de fichier?

Pour plus d’informations sur le langage d’expression, vous pouvez trouver des informations dans la documentation de Spring ici .