2017-01-04 32 views
1

我想通过CDI扩展以编程方式在运行时在EJB中添加拦截器。如何以编程方式添加EJB拦截器?

该EJB公开远程调用的远程接口。但是我想在实现类此EJB在这个其他SO问题添加@Interceptors annontation喜欢的添加这个拦截器(CDI Extensions - Add Interceptors in ProcessAnnotatedType phase

我想以后的EJB已经注册,因为拦截器是CDI扩展只执行从未打过电话

但是,为了测试目的,我已经在一个简单的CDI Bean中以编程方式成功注册并执行了一个Interceptor。

问题是当我尝试在EJB中注册时。

我错过了什么吗?

编辑: 我使用Wildfly 8

回答

2

我认为这里的关键问题是和@Interceptor(CDI的)@Interceptors(EJB的)之间的差异。 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,因此您可以将CDI拦截器附加到它,而无需更改bean本身。