【问题标题】:@ManagedProperty object for authentication data is null身份验证数据的@ManagedProperty 对象为空
【发布时间】:2011-11-09 08:15:44
【问题描述】:

我有以下托管 bean,它在容器身份验证后存储登录数据:

@ManagedBean(name = "authenticatedUserController")
@SessionScoped
public class AuthenticatedUserController implements Serializable {

@EJB
private jpa.UtentiportaleFacade ejbFacade;

  public Utentiportale getAuthenticatedUser() {
    if (AuthenticatedUser == null) {
        Principal principal =   FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal();
        if (principal != null) {
            AuthenticatedUser = ejbFacade.findByLogin(principal.getName()).get(0);
        }
    }
    return AuthenticatedUser;
}

getAuthenticatedUser 在每个页面中都会被调用,因为我将用户名放在右上角的 facelets 模板中。 在另一个托管bean PermessimerceController 中,我需要访问登录数据,因此可以轻松快速地注入上述会话范围控制器:

@ManagedProperty(value = "#{authenticatedUserController}")
private AuthenticatedUserController authenticatedUserController;

我遇到了以下问题:尝试访问链接到 PermessimerceController 的页面而不经过身份验证我被重定向到登录页面(这没关系)但之后我得到一个空指针异常,因为 authenticatedUserController 在它被注入到 PermessimerceController 中。 有问题的页面同时使用了 PermessimerceController 和 AuthenticatedUserController,所以我猜想由于某种原因 PermessimerceController 是在 AuthenticatedUserController 之前创建的。你能提出一个简单的方法来解决这个问题吗? 或者,如何将登录数据存储在易于访问的地方?

谢谢 菲利波

我尝试编辑这篇文章,希望能更好地澄清我遇到的问题并找到有用的答案。 使用 facelets 模板,我通过 AuthenticatedUserController 的属性显示用户登录名。其余内容链接到 PermessimerceController,它需要一些关于用户的信息来过滤数据。 @ManagedBean 注解是实现此目的的一种简单方法。不幸的是,如果用户在未经身份验证的情况下访问该页面,则注入的 AuthenticatedUserController 为空。所以似乎 PermessimerceController 是在 AuthenticatedUserController 之前创建的,我想知道为什么。有什么技巧可以用来确保 AuthenticatedUserController 在之前创建?

【问题讨论】:

  • PermessimerceController 中的 ManagedProperty 是否有 getter 和 setter?
  • @Matt:这会导致像ManagedBeanCreationException 这样的FacesException,而不是访问它时的NPE。
  • BaluC 是对的,我有那个 ManagedProperty 的设置器。

标签: jsf-2 annotations


【解决方案1】:

您显然是在 bean 的构造函数中访问它:

@ManagedProperty("#{authenticatedUserController}")
private AuthenticatedUserController authenticatedUserController;

public PermessimerceController() {
    authenticatedUserController.getAuthenticatedUser(); // Fail!
}

这确实行不通。 bean 是在 依赖注入之前构造的(想想看;依赖注入管理器会如何注入它?)

最早的访问点是@PostConstruct方法:

@ManagedProperty("#{authenticatedUserController}")
private AuthenticatedUserController authenticatedUserController;

@PostConstruct
public void init() {
    authenticatedUserController.getAuthenticatedUser(); // Success!
}

【讨论】:

  • 你的建议是我已经做过的。如果错误是在构造函数中使用了 ManagedProperty,它总是会失败。相反,只有当我在未通过身份验证时尝试直接访问该页面(使用其唯一的 url)时,我才会得到一个空指针异常。如果我首先执行登录,然后通过菜单导航到该页面,则 ManagedProperty 不为空。似乎在创建两个 ManagedBean 之间存在竞争,并且无法弄清楚为什么 PermessimerceController 在另一个之前创建。
  • 在我的第一篇文章中,我谈到了身份验证。我忘了提到,如果我已经通过身份验证,我可以毫无问题地访问链接到 PermessimerceController 的页面。
猜你喜欢
  • 2020-05-22
  • 2016-04-01
  • 2018-09-07
  • 1970-01-01
  • 2021-12-27
  • 2021-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多