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 响应包含完整的源列表,但目标列表为空。

现在解决问题:

当我从左侧选择一个元素时,它会跳到右侧并立即返回。我调试了这个问题并了解到 listSelectBean 的所有 getter 和 setter 都在运行不同的 JSF 阶段时被正确调用。使用 JSF 管理的请求范围 bean 的相同示例可以正常工作(在 Richfaces 展示中),还可以在组件本身上使用 ajax 重新呈现。我怀疑 Spring (Webflow) 中的 bean 处理存在问题。但我无法确定它。任何帮助将不胜感激。

4

1 回答 1

0

经过长时间的调试,我终于找到了问题的解决方案。由于 RichFaces 在渲染过程中使用 HashSet,因此对于 PickList 中使用的复杂对象(这通常是一个好主意)覆盖 hashCode() 和 equals() 方法很重要。否则选定的对象将不会被标记为选中。

于 2013-02-19T11:21:09.313 回答