当两个bean具有相同的范围时,托管属性值不会更新

Vru*_*ank 2 el jsf-2

我在使用时看到这种奇怪的行为@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或其属性.但是"相同范围"的情况似乎在我的代码中不起作用.我在这里错过了什么?

我在用:

  • Mojarra 2.1.16
  • 春天3.2
  • Hibernate 4.1
  • Tomcat 7.0.37

Mr.*_*mes 5

@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)