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

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

ログインに成功した後も、 の値はfalse のままですloggedIn

しかし、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 に答える