我试图通过CDI扩展以编程方式在EJB中添加拦截器。
此EJB公开远程调用的远程接口。但是我试图在这个EJB的实现类中添加这个Interceptor,添加@Interceptors
annontation就像在其他SO问题中那样(CDI Extensions - Add Interceptors in ProcessAnnotatedType phase)
我认为CDI扩展仅在EJB已经注册后执行,因为永远不会调用Interceptor。
但是,出于测试目的,我已经成功地在一个简单的CDI Bean中以编程方式注册和执行Interceptor。
问题在于我尝试在EJB中注册。
我错过了什么吗?
编辑: 我正在使用Wildfly 8
答案 0 :(得分:2)
我认为这里的关键问题是 @Interceptors
(EJB的)和 @Interceptor
(CDI的)之间的区别。 CDI不管理EJB容器,因此在CDI扩展中添加EJB注释(@Interceptors
)不一定会使EJB逻辑生效 - EJB容器可能已经启动,并且它不会知道注释。此外,CDI扩展会将此注释添加到AnnotatedType
,这是EJB可能不会使用的结构。另一方面,所有这些都取决于应用程序服务器,因为它负责CDI / EJB集成,因此作为“奖励”,AS之间的行为可能不同。
CDI扩展允许您挂接到CDI引导程序生命周期,因此您可以使用/启用/添加CDI拦截器。我会试着这样做。顺便说一句,即使SO question you referred to说beans.xml
/ @Priority
启用,这意味着它使用 CDI拦截器而不是EJB。
此外,EJB bean应该自动成为CDI bean,因此您可以在不更改bean本身的情况下将CDI拦截器连接到它。