我在使用时看到这种奇怪的行为@ManagedProperty.我有2个豆子:
UserManager(SessionScoped)
@ManagedBean
@SessionScoped
public class UserManager extends BaseBean implements Serializable
{
private static final long serialVersionUID = 1861000957282002416L;
private User currentUser;
public String login()
{
// set value of currentUser after authentication
}
public User getCurrentUser() {
return currentUser;
}
public boolean isLoggedIn() {
return getCurrentUser() != null;
}
}
Run Code Online (Sandbox Code Playgroud)
CartBean(ALSO SessionScoped)
...
import javax.faces.bean.ManagedProperty;
...
@ManagedBean
@SessionScoped
public class CartBean extends BaseBean implements Serializable
{
@ManagedProperty(value = "#{userManager.loggedIn}")
private boolean loggedIn;
public void updateCart(Movie selectedMovie)
{
if (!loggedIn) {
return;
}
System.out.println("UPDATE CART REQUEST");
int id = selectedMovie.getMovieID();
if (cart.containsKey(id)) {
cart.remove(id);
}
else {
cart.put(id, selectedMovie);
}
}
public void setLoggedIn(boolean loggedIn) {
this.loggedIn = loggedIn;
}
}
Run Code Online (Sandbox Code Playgroud)
成功登录后,值loggedIn 仍保持假.
但是,如果我将CartBean的范围更改为@ViewScoped,则loggedIn更新的值会更新,我会看到sysout.
根据我的理解以及阅读各种文章之后,只有在相同或更广泛的范围内,才可以注入托管bean或其属性.但是"相同范围"的情况似乎在我的代码中不起作用.我在这里错过了什么?
我在用:
@ManagedProperty注释只能提供静态的注入,这意味着注释的属性将得到注入当且仅当在保持@ManagedBean被实例化.
当您部署应用程序时,我相信您CartBean在开始时通过诸如View cart按钮之类的东西被引用.因此,注入过早发生,因为bean是@SessionScoped,您将携带初始false值直到时间结束:).
相反boolean,您应该注入整个UserManagerbean ,而不是仅注入字段:
@ManagedBean
@SessionScoped
public class CartBean extends BaseBean implements Serializable {
@ManagedProperty(value = "#{userManager}")
private UserManager userManager;
public void updateCart(Movie selectedMovie) {
if (!userManager.isLoggedIn()) {
return;
}
...
}
}
Run Code Online (Sandbox Code Playgroud)