似乎有两种方法将拦截器绑定(bind)到目标类/方法:
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)。