【发布时间】: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