0

Richfaces 3.3.3 から Richfaces 4.3.0 への移行の途中で、JSF を 1.2 から 2.1 にアップグレードする必要がありました。また、会話定義には Spring Webflow 2.3.2 (2.1.1 からアップグレード) を使用しています。すべての Bean は Spring によって管理されます (JSF マネージド Bean はありません)。アプリケーションが再び正常に動作するように、いくつかの Richfaces コンポーネントを調整する必要がありました。私が今抱えている問題は、次のような rich:pickListコンポーネントに関するものです (ショーケースの例を取り上げて、問題を説明するために編集しました)。

<rich:pickList id="ownPicklist" value="#{listSelectBean.selectedCapitals}"
  sourceCaption="Available cities" targetCaption="Selected cities"
  listWidth="165px" listHeight="100px">
  <a4j:ajax event="change" execute="@this" render="#{mainBean.dynamicRerenderList}" />
  <f:selectItems value="#{listSelectBean.capitals}" var="capital"
    itemValue="#{capital}" itemLabel="#{capital.name}" />
  <f:converter converterId="CapitalsConverter" />
</rich:pickList>

ショーケースの例とは異なり、ListSelectBean は Spring Bean であり、次のように定義されています。

<bean id="listSelectBean" class="com.xyz.example.bean.ListSelectBean" scope="request" />

カスタム コンバーターは、faces-config.xml に登録されています。

<converter>  
  <converter-id>CapitalsConverter</converter-id>  
  <converter-class>com.xyz.converter.CapitalsConverter</converter-class>  
</converter>

ご覧のとおり、pickList にアタッチされた ajax イベント ハンドラーがあり、リストから選択された値に応じて、再レンダリングされるコンポーネントのリストを動的に計算します。このリストには pickList 自体も含まれており、通常は選択する要素がはるかに少ない状態で再レンダリングする必要があります。取得した ajax 応答には完全なソース リストが含まれていますが、ターゲット リストは空です。

今問題に:

左側から要素を選択すると、右側にジャンプしてすぐに戻ります。この問題をデバッグしたところ、さまざまな JSF フェーズが実行されるときに、listSelectBean のすべてのゲッターとセッターが正しく呼び出されることがわかりました。JSF 管理のリクエスト スコープ Bean を使用した同じ例 (Richfaces ショーケースにあります) は、コンポーネント自体の ajax 再レンダリングでも正常に動作します。Spring (Webflow) の Bean 処理に問題があると思われます。しかし、私はそれを特定することはできません。どんな助けでも大歓迎です。

4

1 に答える 1

0

長時間のデバッグの後、ようやく問題の解決策を見つけました。RichFaces はレンダリング プロセス中に HashSet を使用するため、PickList で使用される複雑なオブジェクト (一般的には良い考えです) に対して hashCode() メソッドと equals() メソッドをオーバーライドすることが重要です。そうしないと、選択されたオブジェクトは選択済みとしてマークされません。

于 2013-02-19T11:21:09.313 に答える