Java 拦截器绑定不';行不通

Java 拦截器绑定不';行不通,java,cdi,interceptor,Java,Cdi,Interceptor,我用javax.interceptor.InterceptorBinding@LogBinding注释了CDI拦截器类,定义如下: @InterceptorBinding @Retention(RUNTIME) @Target({METHOD, TYPE}) public @interface LogBinding {} 然后我在EJB bean上使用注释: @Alternative @Stateless @LogBinding public class FooService {

我用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调用foodmethod。问题是没有调用拦截器。当我在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");
    }
}

为什么它不起作用

您还必须使用该绑定对拦截器类进行注释,以便它知道使用哪个类作为拦截器

@LogBinding
@Interceptor
public class LogInterceptor {...}

Dummy的答案可能是问题所在,但是查看
LoginReceptor
类会有所帮助。我已经添加了拦截器类。首先,我假设您已经验证了(在这个bean之外)拦截器和替代bean的工作方式与您期望的工作方式相同。至于问题的原因——我不确定,但我认为真正的问题是
@Asynchronous
EJB注释。这意味着EJB将把执行转移到另一个线程,这是CDI不知道/无法处理的,因此不会通知拦截器。试着探索一下,我已经用绑定对拦截器进行了注释(请参见更新的问题),但是它不起作用。您应该检查一下这个文档,看看您是否满足会话bean替代方案的要求