Beanはリクエストスコープであり、(ポスト)構築ではなくアクションでのみデータモデルをロードしています。データをロードしたアクション後のHTTP応答が終了すると、Beanはガベージされます。後続のリクエストは、すべてのプロパティがデフォルトに設定されたBeanの新しいインスタンスを取得します。ただし、同じデータモデルは(ポスト)構築中に保存されないため、空のままになります。
JSF2では、を使用してこれを解決し@ViewScoped
ます。null
このようにして、ポストバック(またはを返す)によって同じビューを操作している限り、Beanは存続しますvoid
。
CDIでは、を使用してこれを解決する必要があります。これには、適切なタイミングで完了して呼び出す@ConversationScoped
追加の@Inject Conversation
定型文が必要です。具体的な例については、JSF 2.0forWizardパターンで使用するスコープも参照してください。。begin()
end()
<f:param>
別の方法は、次のようにコマンドリンク/ボタンを介してデータモデルの作成を担当するパラメータを後続のリクエストに渡すことです。
<h:commandButton value="save" ...>
<f:param name="period" value="#{bean.period}" />
</h:commandButton>
次に、次のように、リクエストスコープのBeanの(ポスト)コンストラクターでまったく同じデータモデルを再作成します。
String period = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("period");
List<SapFinancialPeriod> sapFinancialPeriodList = someservice.list(period);
(ちなみに、標準のJSFを使用している場合は、上記の方が解決しやすくなり@ManagedProperty
ます。私が知る限り、CDIには、HTTP要求パラメーターをBeanプロパティとして設定できるアノテーションがありません)
参照:
具体的な問題とは関係なく、次のJSF 2.2は、新しい注釈と新しいタグを備えた新しい「Faces Flow」機能を使用して、この機能要件をより適切に解決します。@FlowScoped
xmlns:j="http://java.sun.com/jsf/flow"