为什么我的FacesContext.getCurrentInstance()。getExternalContext()。getUserPrincipal()代码运行到NullPointer?

时间:2013-11-04 16:51:54

标签: jsf ejb weblogic principal facescontext

我有一个无状态bean,它有一个方法,我想获取当前/已记录的用户。 我得到它的代码:

Principal p1 = FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal();

但是我得到了nullpointer异常。那是为什么?

或者有没有其他方法来获取登录用户? 我正在使用weblogic。

2 个答案:

答案 0 :(得分:3)

你不应该抓住EJB中的FacesContext。更重要的是,您的EJB应该完全不受任何JSF依赖项的影响。换句话说,您不应该在EJB内部从javax.faces.*包导入任何代码。您的EJB应该被设计为可以在您可以想到的所有不同前端重用,例如JSF,JAX-RS,Struts,Spring-MVC甚至是“普通的Servlet”。

如果您正在使用容器管理的安全性或Apache Shiro这样的安全框架,那么您应该使用API​​提供的设施。如果是“普通的vanilla”容器管理的安全性(JAAS通过web.xml等),你应该从SessionContext(正确地来自javax.ejb包)获得它,它可以注入@Resource

@Resource
private SessionContext context;

public void doSomething() {
    Principal principal = context.getCallerPrincipal();
    // ...
}

另一种方法是将登录用户的JPA实体表示作为方法参数传递。

答案 1 :(得分:0)

验证以下库的导入:

javax.faces.bean.SessionScoped;

再试一次