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 ポインター例外が発生します。
私は何が欠けていますか?助けてくれてありがとう。