Java CDI。拦截器仅在类中的第一个方法调用中被调用

标签 java cdi interceptor

<分区>

我正在使用 CDI 拦截器,我意识到只有用 @Interceptor 注释的类中的第一个方法调用会被拦截。在下面的示例中,方法 B 永远不会被拦截。

@InterceptorBinding
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Transactional {

}


@Transactional
@Interceptor
public class TransactionsInterceptor {

    @AroundInvoke
    public Object transactionInterceptor(InvocationContext context) throws Exception {

          System.out.println("Method="+context.getMethod().getName());
          return context.proceed();

    }
}


public Interface AnImportantInterface {
      public void methodA();
      public void methodB();
}

@Transactional
@ThreadScoped
public class AnImportantClass implements AnImportantInterface {

    public void methodA() {

        methodB();
    }

    public void methodB() {

        //This method is never intercepted
    }

}


public class AnotherImportantClass {
    @Inject AnImportantInterface aui;

    public void someMethod() {
        aui.methodA();
    }
}

如果先调用methodA,如何实现methodB被拦截?有什么解决方法吗?

最佳答案

这是因为您是直接调用 methodB() 而不是通过 CDI 代理,所以永远不会调用拦截器。只有在使用其代理调用 CDI bean 方法时才会调用拦截器。您应该将方法 B 移动到另一个 CDI bean 中,并将它的 @Inject 移到这个 bean 中,并将 methodA 更改为 methodB()bean2。方法B(..).

关于Java CDI。拦截器仅在类中的第一个方法调用中被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32129910/

相关文章:

java - Handler 在运行线程时做什么?

java - 哪个是 CDI @Produces 注释的 Spring 等效项?

seam - 在 JSF、Weld 或 Solder 中使用 CDI

java - Spring拦截返回异步调用

java - Weblogic websocket : Cannot load platform configurator

java - Spring + hibernate : Create database from DDL rather than using annotated model classes

Tomcat - 异步请求的 WELD 解决方法

angular - Angular 5 中可以注册多个拦截器吗?

java - 如何在未启用日志记录功能的情况下在 Out 拦截器中获取 http 响应正文?

java - 如何在 spring 项目中使用自定义注释(hibernate)加密/解密数据