@SessionScoped public class User {
... //settings, attributes, etc
}
@ViewScoped public class FooController {
@ManagedProperty(value="#{user}")
private User user;
...
}
@RequestScoped public class LoginController {
@ManagedProperty(value="#{user}")
private User user;
public String login() {
//handle Servlet 3.0 based authenticate()... if success, make new User object and slap it into context
request.getSession().setAttribute("user", user);
return "?faces-redirect=true";
}
...
}
xhtml页面在几乎每一页上都包含登录控件。理想的是他们能够登录,并且页面将刷新,并且现有的FooController
将引用当前登录的用户,该用户有条件地呈现按钮/元素。行为是登录发生,但FooController
视图仍然“有效”,因此托管bean永远不会再次尝试被注入。如果我浏览页面,并返回到它[重建视图范围的bean],用户bean很好地重新注入...但我不希望有这个临时步骤。有任何想法吗?更新视图范围的JSF beans的注入bean
我试过各种形式的FacesContext.getCurrentInstance().getViewRoot().getViewMap().remove("user");
,希望它能重新从会话中拉出来,但无济于事。我不想在我的LoginController中紧密耦合代码,以引用特定的FooController或BarController或任何其他引用用户bean的无效代码。
那么,目标不是要删除用户bean,而是扩大更新的用户对象到任何视图范围的bean。我测试了你的解决方案,它可以工作,但是'FooController'只是大约20个视图范围的bean中的一个,它们可能处于活动状态,这取决于用户登录的页面。 [登录表单是一个弹出式面板,几乎包含在每个页面上]。这似乎是一个纠缠问题,让LoginController的代码名称为20+ beans试图删除。 – Eric