0

view() というアクション メソッドと MyObject 型のフィールドを持つ Bean があります。

@ManagedBean
@ConversationScoped
public class MyBean implements Serializable{
    private @Inject Conversation conversation; //has getter and setter
    private MyObject object; //has getter and setter
    ... other fields follow

    public String view(MyObject selectedObj){
        conversation.begin();
        return "success";
    }

    public String getSomeProperty(){
            return object.getProperty();
    }

    ...other methods follow
}

screen1.xhtml では、primefaces p:dataTable を var="obj" で使用して、commandButton で行を出力し、ユーザーがクリックした行のオブジェクトを表示しています。各行のボタンは次のようになります。

<p:commandButton action="#{myBean.view(obj)}"
ajax="false" title="View Clone" image="ui-icon ui-icon-locked"/>

ユーザーがいずれかの行の commandButton をクリックすると、page2.xhtml に移動し、obj に関する詳細情報が表示されます。これは正しく機能し、詳細が表示されます。view(MyObject selectedObj) アクション メソッド内にいるとき、すぐに conversation.begin() を呼び出し、this.obj = selectedObj を割り当て、ユーザーが page2.xhtml を取得します。

ただし、ユーザーが page2 の commandButton をクリックすると、スコープが会話に昇格されたため、page1 から来たときに発生した view() アクション呼び出しから割り当てられた obj とは異なる情報で再表示されます。これは起こっていません。Bean の obj フィールドは、スコープによって失われないようにする必要がある場合に、null になります。そのため、ページ 2 で commandButton をクリックすると、ページが #{myBean.someProperty} を解決しようとすると、null ポインター例外が発生します。

私は何が欠けていますか?助けてくれてありがとう。

4

2 に答える 2

3

@ConversationScoped は、JSF 自体ではなく、CDI の機能です。つまり、正しく機能させるには、@ManagedBean ではなく、@ConversationScoped を @javax.inject.Named と組み合わせて使用​​する必要があります。

CDI はデフォルトでは JSF 2.0 または 2.1 に含まれていないため、Weld ( http://seamframework.org/Weldを参照) などの CDI 実装と、weld で説明されている「空の beans.xml」も追加する必要があります。ドキュメンテーション。

于 2012-07-25T06:08:28.520 に答える
2

@ConversationScopedCDIの注釈です。これを使用する場合、@ManagedBeanこれは JSF アノテーションであり、決して使用してはなりません。代わりに、Bean に で注釈を付ける必要があります@Named

于 2012-12-06T04:43:41.540 に答える