首页 > 解决方案 > 在抽象类中定义方法时,在方法连接点停止 spring-batch-application

问题描述

更新内容:对于我项目中批处理应用程序的一些系统测试,我想从测试类中影响作业步骤的行为。为此,我将“MethodInterceptor”附加到任何步骤 bean,例如 bean 的异常抛出拦截器writer

在我的例子中,writer 类Xyzwriter正在扩展一个实现ItemWriter.

public abstract class Abstractwriter implements ItemWriter {
...
@override 
public void write(){
//writing
}


public class Xyzwriter extends Abstractwriter {

   public void someMethod(){
    //dowhat
   }

}

请注意,该write方法仅在抽象类内部被覆盖。

现在我想完全停止该write方法的批处理。所以我必须将方法拦截器传递给writerbean。为此,我定义了一个 BeanPostProcessor,并在配置类中为它的 write 方法附加了一个 Methodinterceptor 到 writer bean:

myBeanPostProcessor.getMap().put("Xyzwriter", dangerousWriterInterceptor); 
 

在哪里:

public class MyBeanPostProcessor implements BeanPostProcessor {

private Map<String , MyInterceptoredBeanType> map = new HashMap<>();

  @Override
  public Object postProcessAfterInitialization(Object bean, String intercepedBeanName) throws BeansException {

       if ( map.get(intercepedBeanName) != null ){
         return map.get(intercepedBeanName);
       }
       return bean;
  }
}

在加载 spring 上下文后的测试内部,我打开/关闭 bean 的异常抛出-bahvior dangerousWriterInterceptor,然后开始工作。

但是,这样,我得到错误:'NoSuchMethodException'。这很清楚,因为write只在抽象类中定义!

第二次尝试:我覆盖了类似的write方法XYZwriter

public class XYZwriter extends Abstractwriter {

   @Override
   public void write(){ 
      super.write(args);
   }

}

在这种情况下得到错误:

nested exception is java.lang.IllegalArgumentException: found more than one method on target class[XYZwriter$$EnhancerBySpringCGLIB$$1052d06a] with the annotation type [BeforeStep].

我该怎么做才能使用我的来拦截 write 方法BeanBosProcessor

标签: javaspring-batchinterceptor

解决方案


推荐阅读