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

标签 jsf ejb weblogic principal facescontext

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

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

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

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

最佳答案

您不应该获取 EJB 中的 FacesContext。更重要的是,您的 EJB 应该完全摆脱任何 JSF 依赖性。换句话说,您不应该从 EJB 内的 javax.faces.* 包导入任何代码。您的 EJB 的设计方式应该是它们可以在您能想到的所有不同前端(例如 JSF、JAX-RS、Struts、Spring-MVC 甚至“plain vanilla”Servlet)中重用。

如果您使用容器管理的安全性或 Apache Shiro 等安全框架,那么您应该使用 API 提供的工具来实现这一点。如果是“普通”容器管理的安全性(通过 web.xml 等 JAAS),您应该从 SessionContext 获取它。 (正确地来自 javax.ejb 包),可以作为 @Resource 注入(inject)。

@Resource
private SessionContext context;

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

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

关于jsf - 为什么我的 FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal() 代码运行到 NullPointer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19772780/

相关文章:

java - 使用 ui :include 在 JSF 中显示动态编辑器

java - JSF 服务层

java - 使用客户端在 EJB 中使用有状态 bean

java - 来自 Hibernate 的同步类加载器调用

python - 使用 WLST 创建 Weblogic 域和集群

java - weblogic 12.1.3 config.sh 显示错误

html - 如何为多个元素添加一个工具提示?

jsf - 分解 EAR 文件

java - 大型java项目解决方案

java - 在EJB模块中的Restful服务中创建Session