1

私はJavaとJSFを初めて使用します。IllegalStateExceptionについてサポートが必要です。シナリオは次のとおりです。

私の現在のプロジェクトでは、アプリケーションメニュー用に次のセッションスコープBeanを使用しています。

public final class MenuBean implements Serializable{  
    private MenuModel model;
    private FacesContext context = FacesContext.getCurrentInstance();

    public MenuModel getModel() {
        return model;
    }

    public MenuBean() {
        updateMenu();
    }

    public void updateMenu(){
        Map session = (Map<String,Object>) context.getExternalContext().getSessionMap();
        EUser user = (EUser) session.get(UserBean.USER_SESSION_KEY);

        ...
    }

    private MethodExpression createMethodExpression(String action) {  
        ...  
    }
}

ロジックのある時点で、メニューを更新する必要があるので、次のようにします。

ExternalContext extContext = context.getExternalContext();
Map sMap = (Map<String,Object>) extContext.getSessionMap();

MenuBean menu = (MenuBean) sMap.get("menuBean");
menu.updateMenu();

Beanは正常に構築されますが、上記のように手動で更新しようとすると、updateメソッドの1行目にIllegalStateExceptionが発生します。updateMenu()

メニューが最初に作成されたときに同じ呼び出しでセッションマップを取得できるため、何が問題なのかわかりません。

また、NetBeansデバッガを使用すると、MenuBeanのインスタンスが正しくリカバリされていることがわかります。

助けてくれませんか?

4

1 に答える 1

2

FacesContextHTTP 要求スレッドに格納されます。HTTPリクエストよりも長く存続するインスタンスのインスタンス変数として宣言して割り当てることは絶対にしないでください(そして、それがすでにリクエストベースである場合はそうしないことをお勧めします-それは悪い設計です)。FacesContextHTTP 要求が終了すると、インスタンスは解放され、無効化されます。後続の HTTP 要求では、インスタンスは無効になります。違法国家の手段があります。IllegalStateExceptionそれはあなたが見ていることを説明しています。

次の行を削除する必要があります。

private FacesContext context = FacesContext.getCurrentInstance();

メソッドブロックでスレッドローカルのみを取得するようにコードを修正します。

Map<String, Object> sessionMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
// ...

いつでも変数として割り当てることができますが、それはスレッドローカルにのみ保持する必要があります:

FacesContext context = FacesContext.getCurrentInstance();
Map<String, Object> sessionMap = context.getExternalContext().getSessionMap();
// ...

具体的な問題とは関係ありませんが@ManagedProperty、この特定のケースでは使用が簡単になりました。

public final class MenuBean implements Serializable {  

    @ManagedProperty("#{user}")
    private EUser user;

    // ...
}

その後、JSF がそれを挿入します。

于 2012-05-08T21:38:50.283 に答える