【发布时间】:2015-04-22 18:21:36
【问题描述】:
上下文:
Wildfly 8.1.0 与 CDI 1.2
根据CDI1.2的CDI规范,如果beans.xml注解为@Priority(somepriorityvalue),则无需在beans.xml中声明cdi
但是,除非我添加 @Dependent 注释,否则永远不会调用以下 cdi 拦截器
@RequiresLoggedInAccount
@Interceptor
@Priority(Interceptor.Priority.APPLICATION)
public class MyInterceptor {
@AroundInvoke
public Object intercept(final InvocationContext ic) throws Exception {
//intercept something and then...
return ic.proceed();
}
}
和拦截器绑定:
@Inherited
@Documented
@InterceptorBinding
@Target({METHOD, TYPE})
@Retention(RUNTIME)
public @interface RequiresLoggedInAccount {
}
请注意,拦截器绑定和拦截器是在与它们使用的地方不同的 jar 模块中定义的(因此@Priority 的用途)。
这是我忽略的东西吗?为什么我必须添加CDI 的@Dependent 作用域才能让拦截器启动?
是不是因为我在beans.xmlbean-discovery-mode="annotated"里特别说明了
【问题讨论】:
-
WildFly 8.1 附带 Weld 2.1。您是否手动升级到 Weld 2.2?
-
@JohnAment 哦,该死的。它确实随 CDI 1.1 一起提供,这能解释这种行为吗?
-
这是否也能解释为什么用两个不同的 InterceptorBindings 注释单个拦截器会使拦截器无法加载?
-
我不确定规范是否支持多个拦截器绑定。是的,如果您没有手动升级,那将解释您所看到的。 bean 定义注释列表在 1.2 中扩展。
标签: java jakarta-ee cdi java-7