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

I'm using CDI Interceptors and I've realized that only the first method call in a class annotated with @Interceptor is intercepted. In the example below methodB is never intercepted.

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

}

}

How can I achieve that methodB be intercepted if methodA is called first? is there some workaround?

解决方案

It's because you are calling methodB() directly and not via the CDI proxy so the interceptor is never invoked. Interceptors will only be invoked when the CDI bean method is called using its proxy. You should move method B into another CDI bean and @Inject it into this one and from methodA change methodB() to bean2.methodB(..).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值