【问题标题】:Can't populate the right side of RichFaces 4 pickList backed by Spring Webflow managed Beans无法填充 Spring Webflow 托管 Bean 支持的 RichFaces 4 pickList 的右侧
【发布时间】:2013-01-31 08:48:09
【问题描述】:

我正在从 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 的所有 getter 和 setter 都被正确调用。使用 JSF 管理的请求范围 bean 的相同示例可以正常工作(在 Richfaces 展示中),以及组件本身的 ajax 重新呈现。我怀疑 Spring (Webflow) 中的 bean 处理存在问题。但我无法确定它。任何帮助将不胜感激。

【问题讨论】:

    标签: ajax spring jsf-2 richfaces spring-webflow-2


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2012-01-04
      • 1970-01-01
      • 2010-10-24
      • 2011-11-23
      • 2011-06-10
      • 1970-01-01
      • 2012-06-03
      • 1970-01-01
      • 2019-03-25
      相关资源
      最近更新 更多