0

我使用 JSF 2 和 EJB 3.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

我该怎么做才能解决它?

预先感谢

4

3 回答 3

3

在 JSF 2.1 和更早的版本中,PhaseListener 很遗憾没有注入目标(这意味着您不能在其中使用注入)。不过,您可以通过 JNDI 以编程方式进行查找。

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

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

于 2012-04-08T21:37:40.580 回答
2

使用servlet 过滤器而不是 JSF 阶段侦听器来进行授权。您可以@EJB@WebFilter.

于 2012-04-10T12:36:31.233 回答
0

是的,在网络过滤器中,您可以只使用普通的@EJB。如果您有两个 bean 实现相同的AuthorizationService接口,则最多需要添加beanName 。 Servlet 过滤器是每个请求的,我认为您不需要在 JSF 生命周期的某个阶段(比整个 http 请求更细粒度)做安全工作。 对于正常查找,您可以执行以下操作:



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

在尝试中捕获 javax.naming.NamingException

于 2012-04-14T12:10:18.437 回答