xhtmlビューをサポートするビュースコープのJSF管理対象Beanがあり、 f:viewParamを使用してURLから1つのパラメーターを読み取ります。
ビューはユーザーにフォームを表示します。ただし、ユーザーがp:commandButtonを押してフォームを送信すると、ビュースコープのBeanが再作成されたように見えるため(これを確認するために@PostConstructアノテーションを追加しました) 、 f:viewParamから読み取られたインスタンス変数を覚えていません。 (以下のコードのinvId)。
私は元々、URLパラメーターを含むGETを使用してビューに移動しましたが、ユーザーがp:commandButtonを押したときに送信されるPOSTメッセージにはURLパラメーターが含まれていません。したがって、JSFランタイムがPOSTでURLパラメーターを認識しない場合、これは別のビューであると見なされ、JSF管理対象Beanを再作成していると思います。ビュースコープをセッションスコープに変更すると、コードは機能します。
コードは次のとおりです。
見る
<f:metadata>
<f:viewParam name="invId" value="#{registerBean.invId}"/>
</f:metadata>
<h:form id="registrationForm">
....
<p:commandButton value="register" action="#{registerBean.register}"
icon="ui-icon ui-icon-newwin" ajax="false"/>
</h:form>
バッキングビーン
@ManagedBean
@ViewScoped
public class RegisterBean implements Serializable {
@ManagedProperty(value="#{invId}")
private String invId;
...
アップデート
これは、URLパラメータとはまったく関係がないことがわかりました。以下のBalusCのアドバイスに従って、ビューが使用していたc:whenタグを削除し(同じ効果を得る代わりにレンダリングされた属性に依存)、ビュースコープのBeanが再作成されなくなり、invIdフィールドが適切に保持されるようになりました。