2

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

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

但是我得到了空指针异常。这是为什么?

或者有没有其他方法可以获取登录用户?我正在使用网络逻辑。

4

2 回答 2

3

您不应该FacesContext在 EJB 中获取。更重要的是,您的 EJB 应该完全没有任何 JSF 依赖项。换句话说,您不应该从javax.faces.*EJB 中的包中导入任何代码。您的 EJB 应该被设计成可在您能想到的所有不同前端(例如 JSF、JAX-RS、Struts、Spring-MVC 甚至“普通的”Servlet)中重用。

如果您使用的是容器管理的安全性或像 Apache Shiro 这样的安全框架,那么您应该为此使用 API 提供的工具。在“普通”容器管理安全性(JAAS via等web.xml)的情况下,您应该获得可以注入为.SessionContextjavax.ejb@Resource

@Resource
private SessionContext context;

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

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

于 2013-11-04T17:04:07.847 回答
-1

验证以下库的导入:

javax.faces.bean.SessionScoped;

再试一次

于 2018-04-02T19:12:16.873 回答