验证数据的@ManagedProperty对象为null

时间:2011-11-09 08:15:44

标签: jsf-2 annotations

我有以下托管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模板中。 在PermessimerceController,另一个托管bean,我需要访问登录数据,因此注入上面的会话范围控制器很容易和快速:

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

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

由于 菲利普

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

1 个答案:

答案 0 :(得分:2)

你显然是在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!
}