似乎有两种方法将拦截器绑定(bind)到目标类/方法:

  • @Interceptors on target class/method
  • Declare a interceptor binding type (aka, a custom annotation annotated with @InterceptorBinding itself, for example @Logged), and using it on target class/method

  • 我在CDI环境中使用拦截器。我的问题是,如果我使用@Interceptors将拦截器绑定(bind)到目标方法,是否完全不需要声明额外的interceptor binding type

    如果答案是,那么为什么IntelliJ IDEA不断向我提示一个错误



    当我不在拦截器上注释interceptor binding type时?

    如果答案是,我已经使用@Interceptors(arrayOfMyInceptor)直接将拦截器绑定(bind)到目标类/方法,为什么还要声明一个额外的interceptor binding type并在拦截器上使用它呢?

    我在网上搜索,但找不到关于这两种方法的区别的任何信息,希望SO可以解决我的问题。

    感谢您的耐心等待。

    最佳答案

    批注@Interceptor和其他Costum批注(如@Logged)应该在拦截器类上调用,例如

    @Logged
    @Interceptor
    @Priority(Interceptor.Priority.APPLICATION)
    public class LoggedInterceptor implements Serializable { ... }
    

    必须在要创建的注释上调用注释@InterceptorBinding,以使其具有某种“拦截器限定符”的含义。
    @Inherited
    @InterceptorBinding
    @Retention(RUNTIME)
    @Target({METHOD, TYPE})
    public @interface Logged {
    }
    

    然后,您可以在(托管的)Bean或其方法上调用拦截器绑定(bind)注释。
    @Logged
    public String pay() {...}
    
    @Logged
    public void reset() {...}
    



    编辑

    因为我没有读懂您的问题,所以这是我的修改:
    注释@Interceptors就像拦截器的集合。
    通过将几个拦截器类(例如LoggedInterceptor中的@Logged)传递给所应用的value批注的@Interceptors变量,将调用所有这些接收器绑定(bind):
    @Interceptors({LoggedInterceptor.class,
    OtherInterceptor.class,.....})
    

    因此,您至少需要一个@Interceptors的拦截器绑定(bind)

    因此,您需要拦截器类本身的拦截器绑定(bind),而不是目标类的拦截器绑定(bind),因为@Interceptors批注中已经提到了该绑定(bind)。

    09-11 03:49