Spring Batch @BeforeContext не может выполнить

У меня есть ситуация в весенней партии, когда у меня есть несколько процессоров элементов, которые составляют процессор составных элементов. Мне нужно поделиться некоторыми данными контекста между двумя процессорами на одном этапе. Я нашел рабочее решение для доступа к контексту, показанному ниже. Тем не менее, есть альтернативное решение, которое кажется немного чище, но в нем используется @BeforeStepAnnotation, который никогда не вызывается. Если возможно, я хотел бы использовать второе решение. Мы очень ценим любые советы о том, как это сделать.

Это работает:

@Component
@StepScope
public class MyItemProcessor implements ItemProcessor<String,String> {

   @Value(#{stepExecution});
   private StepExecution stepExecution;


   public String process(String s){
     //Do things

     Context context = new Context();
     context.set("Hello Context");

     ExecutionContext executionContext = stepExecution.getExecutionContext();
     executionContext.put("Context", context);

   }

}

Это не удается:

@Component
@StepScope
public class MyItemProcessor implements ItemProcessor<String,String> {

   private ExecutionContext executionContext;

   public String process(String s){
      //Do things
      Context context = new Context();
      context.set("Hello Context");

      executionContext.put("Context", context);
   } 


   @BeforeStep
   public getCurrentContext(StepExecution stepExecution){
         executionContext = stepExecution.getExecutionContext();
   } 

}

1 ответ

Решение

Поскольку ваш обработчик элементов является частью композита, он не подвергается интроспекции @BeforeStepаннотация и, следовательно, он не зарегистрирован как слушатель. Spring Batch будет анализировать только тот объект, который зарегистрирован как процессор (композит в вашем случае), а не весь граф объекта.

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

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