无法填充由Spring Webflow托管Beans支持的RichFaces 4 pickList的右侧

时间:2013-02-15 11:26:21

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

我正在从Richfaces 3.3.3迁移到Richfaces 4.3.0,它要求从1.2升级到2.1的JSF升级。我们还使用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 rerender。我怀疑Spring中的bean处理有问题(Webflow)。但我无法确定它。任何帮助将受到高度赞赏。

1 个答案:

答案 0 :(得分:0)

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