Overriding Declarative Method
宣言メソッドの上書きを使うとき:
①
Managed-beanのscopeがsessionの場合:以下ようなエラーが出てきた。
JBO-29000: javax.faces.FacesException:
参照先オブジェクト
: '#{bindings}'
の範囲が参照元オブジェクトより短くなっています
②
Managed-beanのscopeがrequestの場合:以下ようなエラーが出てきた。
JBO-29000: java.lang.IllegalArgumentException: Object: {} is not a known entity type.; nested exception is: java.lang.IllegalArgumentException: Object: {} is not a known entity type.
原因:
① 宣言メソッドの上書きを含めてある
Managed-beanのscopeは必ずrequestとなる。Scopeがsessionだったら、以下のエラーになります:
JBO-29000: javax.faces.FacesException: 参照先オブジェクト: '#{bindings}' の範囲が参照元オブジェクトより短くなっています
原因:これは、上書きするメソッドを含むマネージドBeanのスコープが、
request
より大きい(つまり、
session
または
application
である)ためです。メソッドで参照されるバインディング・コンテナ内のデータのスコープが
request
であるため、このマネージドBeanのスコープは
request
か、より小さいスコープに設定する必要があります。
②
今は二つ画面:一覧画面 ―> 編集画面。
遷移元画面(一覧画面)の処理:
<af:setActionListener from="#{row.itemCode}"
to="#{backing_untitled4.itemCode}"/>
遷移先画面(編集画面)の処理:
<methodAction id="mergeEntity"
… … … …
<NamedData NDName="entity"
NDValue="${bindings.searchXxodfItemIter.currentRow.dataProvider}"
NDType="java.lang.Object"/>
</methodAction>
宣言メソッドの上書きを使うとき:以下の現象が発生されます:
Managed-beanのscopeがrequestの場合:
編集画面から遷移元画面(一覧画面)へ戻るとき、更新されたデータは遷移元画面テーブルの一行目だけに表示されまして、元々の一行目は隠されました。更新元データもテーブルに保留されます。
Session
の場合は問題がない。
原因:具体的に原因分からないですけど、たぶん渡しているパラメータを落ちました。
解決:遷移元画面のパラメータを直接に遷移先画面のマネージド
bean
のプロパティへ渡されない。この二つ画面間に新しい
sessionBean
を作成して、遷移元画面のパラメータをこの新作成の
sessionBean
に渡します。
また:
上書き済メソッドを使用するボタンをクリックすると、
#{bindings}
という値(バインディング・コンテナへの参照)を持つ管理プロパティがバッキングBeanに追加される。
Faces-config.xmlファイルに以下のソースを追加:
<managed-property>
<property-name>bindings</property-name>
<value>#{bindings}</value>
</managed-property>
Managed-bea
ファイルに以下のソースを追加:
private BindingContainer bindings;
public BindingContainer getBindings() { return this.bindings; }
public void setBindings(BindingContainer bindings) { this.bindings = bindings;}
public String commandButton1_action() {
BindingContainer bindings = getBindings();
OperationBinding operationBinding =
bindings.getOperationBinding("mergeEntity");
Object result = operationBinding.execute();
if (!operationBinding.getErrors().isEmpty()) {
return null;
}
return "back";
}
それで、
上書き済メソッドを削除する時、Faces-config.xmlファイルに以上のソースも必須削除されます、逆には、既存のファイルに新しいコントロールをドラッグして、同じエラーが表示される。
参考ファイル: