我有用javax.interceptor.InterceptorBinding @LogBinding注释的CDI拦截器类,定义如下:
@InterceptorBinding
@Retention(RUNTIME)
@Target({METHOD, TYPE})
public @interface LogBinding {}
然后我在EJB bean上使用注释:
@Alternative
@Stateless
@LogBinding
public class FooService {
@Asynchronous
public fooMethod() {
}
}
我从另一个bean调用fooMethod。问题是拦截器没有被调用。当我在FooService上将@LogBinding注释更改为@Interceptors({LogInterceptor.class})时,一切正常。 我不知道它是否有影响,但FooService的市场是@Alternative,因为它在其他地方作为EJB bean注入,下面是生产者字段:
@Default
@Produces
@EJB
private FooService fooService;
@Interceptor
@LogBinding
@Priority(Interceptor.Priority.APPLICATION)
public class LogInterceptor {
@AroundInvoke
public Object invoke(final InvocationContext invocationContext) throws Exception {
System.out.println("it works");
}
}
为什么它不起作用?
答案 0 :(得分:1)
你还必须使用该绑定来注释你的拦截器类,以便它知道哪个类用作拦截器
@LogBinding
@Interceptor
public class LogInterceptor {...}