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

}

解决方法

由于项目处理器是组合处理器的一部分,因此@BeforeStep注释不会自检,因此不会注册为侦听器。 Spring Batch将仅检查已注册为处理器的对象(在您的情况下为复合对象),而不是整个对象图。

您需要将任何组成处理器注册为侦听器,才能正常工作。以下链接可能会有所帮助:

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...