当前位置: 代码迷 >> 综合 >> Overriding Declarative Method
  详细解决方案

Overriding Declarative Method

热度:72   发布时间:2024-01-18 15:59:00.0
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ファイルに以上のソースも必須削除されます、逆には、既存のファイルに新しいコントロールをドラッグして、同じエラーが表示される。
参考ファイル:
http://otndnld.oracle.co.jp/document/products/as10g/101320/doc_cd/web.1013/B40012-01/web_adv005.htm#CACDJCFE
  相关解决方案