>我有一个无状态的bean,它有一个方法,我想在其中获取当前/登录的用户。我的代码来获取它:
Principal p1 = FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal();
但是我对此收到空指针异常。为什么?
或者有没有其他方法可以获取登录的用户?我正在使用网络逻辑。
你不应该在 EJB 中获取FacesContext
。更重要的是,你的 EJB 应该完全不受任何 JSF 依赖的影响。换句话说,您不应该在 EJB 中从包javax.faces.*
导入任何代码。你的EJB应该这样设计,它们可以在你能想到的所有不同的前端上重用,比如JSF,JAX-RS,Struts,Spring-MVC,甚至是"普通的"Servlets。
如果您使用的是容器托管安全性或像 Apache Shiro 这样的安全框架,那么您应该使用 API 提供的工具。在"普通"容器托管安全性(JAAS通过web.xml
等)的情况下,您应该从SessionContext
(正确地来自javax.ejb
包)获取它,可以作为@Resource
注入。
@Resource
private SessionContext context;
public void doSomething() {
Principal principal = context.getCallerPrincipal();
// ...
}
另一种方法是将登录用户的 JPA 实体表示形式作为方法参数传递。
验证以下库的导入:
javax.faces.bean.SessionScoped;
再试一次