2

我在使用@ManagedProperty. 我有2个豆子:

用户管理器(会话范围)

@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;
   }
}

CartBean也是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;
   }
}

登录成功后, 的值loggedIn 仍然保持为false。

但是,如果我将 CartBean 的范围更改为@ViewScoped,则值loggedIn会更新并且我会看到 sysout。

根据我的理解,并且在阅读了各种文章之后,只有当它具有相同更广泛的范围时,才能注入托管 bean 或其属性。但是“相同范围”的情况似乎在我的代码中不起作用。我在这里想念什么?

我在用:

  • 莫哈拉 2.1.16
  • 春天 3.2
  • 休眠 4.1
  • 雄猫 7.0.37
4

2 回答 2

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;
       }

       ...
   }
}
于 2013-04-01T19:44:19.937 回答
0

解决方案是使用 Omnifaces,每次值更改时它都对我有用,您将获得新值

@ManagedBean
@ViewScoped
public class CartBean extends BaseBean implements Serializable {

   private boolean loggedIn;

   public void updateCart(Movie selectedMovie) {
loggedIn=Faces.evaluateExpressionGet("#{userManager.loggedIN}");
       if (!userManager.isLoggedIn()) {
           return;
       }

       ...
   }
}
于 2014-10-29T14:26:03.153 回答