如何在PhaseListener中调用EJB

时间:2012-04-08 08:01:40

标签: jsf ejb

我使用JSF 2和EJB 3.1,所有这些都部署在Glassfish 3.1上。

当我设置一个名为MyInterceptor的类,它实现了PhaseListener时,我无法撤销其中的远程EJB接口。

注意到“NullPointerException ...”

public class MyInterceptor implements PhaseListener {

@EJB(name="AuthorizationEJB", 
            beanInterface=AuthorizationService.class,
            mappedName="corbaname:iiop:localhost:3700#ejb/AuthorizationEJB")
public AuthorizationService authorizationService;

....

} 

当我调用authorizationService.dosomestuff()时,它会引发错误NullPointerException

我该如何解决?

提前感谢

3 个答案:

答案 0 :(得分:3)

在JSF 2.1及更早版本中,不幸的是,PhaseListeners没有注入目标(意味着你不能在其中使用注入)。您可以通过JNDI以编程方式进行查找。

在JSF 2.2中,所有JSF工件(包括PhaseListeners)都将是注入目标,但现在这可能对您没有帮助。

与您的问题无关,但我不确定您要通过在注释中指定beanInterface来实现目标。很可能你也不需要name属性,如果你的bean是本地bean,你也不需要mappedName

答案 1 :(得分:2)

使用servlet filter代替JSF阶段侦听器进行授权。您可以在@EJB中注入@WebFilter

答案 2 :(得分:0)

是的,在网络过滤器中你可以使用普通的 @EJB 。如果有两个bean实现相同的 AuthorizationService 接口,则需要添加 beanName 的最大值。

Servlet过滤器是按请求进行的,我认为您不需要在JSF生命周期的某个阶段(这是一个比整个http请求更精细的级别)执行安全性工作。

对于正常查找,您可以这样做:

AuthorizationService.class.cast(new InitialContext().lookup("corbaname:iiop:localhost:3700#ejb/AuthorizationEJB")).dosomestuff();

在try catch javax.naming.NamingException