我使用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
我该如何解决?
提前感谢
答案 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
中