2

こんにちは

2 つのマネージド Bean があり、1 つは View スコープ、もう 1 つは Session スコープです。View スコープ Bean は次のように定義されます。

@ManagedBean
@ViewScoped
public class InvoiceController implements Serializable {
  private static final long serialVersionUID = 1L;

  @ManagedProperty(value="#{invoiceService}")
  private InvoiceService invoiceService;

セッションスコープのBean

@ManagedBean
@SessionScoped
public class InvoiceService implements Serializable{

セッション スコープ Bean を使用して、パネルをレンダリングする必要があるかどうかを決定するために使用されるフラグを保持しています。これをデバッグで実行すると、セッション Bean でメソッドを呼び出すたびに、Bean の新しいインスタンスであることがわかります。したがって、リクエスト間で my フラグの値を保持しません。

私は何を間違っていますか?

4

2 に答える 2

9

これは、パッケージからではなくパッケージからインポート@SessionScopedした場合に発生する可能性があります。前者は CDI Bean でのみ機能し、後者は JSF Bean でのみ機能します。javax.enterprise.contextjavax.faces.bean@Named@ManagedBean

@ManagedBean有効なスコープを持たないJSFは、デフォルトで に設定されます。@NoneScopedこれは、@ManagedProperty. これは、あなたが見ている症状を説明しています。

于 2012-08-09T16:59:40.327 に答える
0

同様の問題がありました。ビュー スコープ Bean で save-method を使用して、セッション スコープ Bean のメソッドを呼び出していくつかの値を更新します。

これは私がデバッグで見つけたものです(私の非Java教祖の英語を許してください):

ページを最初にロードしたとき、挿入されたセッション Bean のインスタンス番号は、たとえば 111111 でした。しかし、save メソッド (およびコマンド ボタンやアクション リスナーなどのアクションによって呼び出される他のすべてのメソッド) では、突然、セッション Bean が別のものでした。インスタンス (たとえば 222222)。

インスタンス 111111 と 222222 の両方に、まったく同じ値が含まれていました。今呼び出したすべてのメソッドは 222222 インスタンスで実行され、そこで必要に応じて値が変更されました。しかし、111111 インスタンスは手付かずのままでした。

したがって、222222 は基本的に 111111 のディープ (?) クローンであり、コピーではありません。

しかし、保存メソッドが実行され、ページがリロードされた後、元の 111111 インスタンスがビュー スコープ Bean で再び使用されました。222222 のインスタンスがゴミ箱に捨てられました。

この問題に対する私の解決策:

ManagedProperty インジェクションはもう使用していません。

代わりに、必要に応じてセッション Bean を取得するためのヘルパー コードをいくつか作成しました (別名、ビュー スコープ Bean メソッド内)。

public Object getSessionBean(String sessionBeanName)
    {
        return FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(FacesContext.getCurrentInstance().getELContext(), null, sessionBeanName);
    }

上記の例では、呼び出しは次のようになります。

InvoiceService InvoiceService = (InvoiceService) helper.getSessionBean("invoiceService");

メソッドで呼び出します。ビュー スコープの Bean にフィールドとして格納しないでください。

これが何らかの形で問題の解決に役立つことを願っています。

于 2013-03-05T15:30:50.993 に答える