如何以编程方式添加EJB拦截器?

时间:2017-01-04 01:12:14

标签: java java-ee ejb wildfly cdi

我试图通过CDI扩展以编程方式在EJB中添加拦截器。

此EJB公开远程调用的远程接口。但是我试图在这个EJB的实现类中添加这个Interceptor,添加@Interceptors annontation就像在其他SO问题中那样(CDI Extensions - Add Interceptors in ProcessAnnotatedType phase

我认为CDI扩展仅在EJB已经注册后执行,因为永远不会调用Interceptor。

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

问题在于我尝试在EJB中注册。

我错过了什么吗?

编辑: 我正在使用Wildfly 8

1 个答案:

答案 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 tobeans.xml / @Priority启用,这意味着它使用 CDI拦截器而不是EJB。

此外,EJB bean应该自动成为CDI bean,因此您可以在不更改bean本身的情况下将CDI拦截器连接到它。