我有以下托管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之前创建的技巧?
答案 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!
}