我使用的是JSF2和EJB3.1,它们都部署在Glassfish 3.1上。
当我设置一个用PhaseListener实现的名为MyInterceptor的类时,我不能撤销它内部的远程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
我怎么做才能修复它呢?
提前感谢
发布于 2012-04-09 05:37:41
不幸的是,在JSF2.1及更早版本中,PhaseListeners不是注入目标(这意味着您不能在其中使用注入)。不过,您可以通过JNDI以编程方式进行查找。
在JSF2.2中,所有JSF工件(包括PhaseListeners)都将是注入目标,但现在这可能对您没有帮助。
与您的问题无关,但是我不确定您试图通过在注释中指定beanInterface来实现什么。最有可能的情况是,您也不需要name属性,如果您的bean是本地bean,那么您也不需要mappedName__。
发布于 2012-04-10 20:36:31
使用servlet filter而不是JSF阶段侦听器进行授权。您可以在@WebFilter中注入@EJB。
发布于 2012-04-14 20:10:18
是的,在web filter中,你可以只使用简单的@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
https://stackoverflow.com/questions/10061342
复制相似问题