Spring Webflow中的primefaces组件的持久性

时间:2012-03-23 10:24:04

标签: jsf jsf-2 primefaces spring-webflow

我遇到了Spring Webflow中持久化primefaces组件的问题。如果组件被实例化为原始页面请求的一部分,一切正常。但是,如果组件在ajax请求期间被实例化,则它们不会被正确保留,并且在稍后检索它们时我们会得到一个空对象。这样的效果是例如tabview的第二个选项卡上的组件(具有dynamic = true)不起作用。一个例子:

<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:c="http://java.sun.com/jsp/jstl/core">

    <h:head>
        <ui:insert name="headIncludes" />
    </h:head>
    <h:body>
        <h:form id="testForm">
            <p:tabView id="myTabView" dynamic="true">
                <p:tab title="Tab One" id="tabOne">
                    <h:panelGroup id="tabOneGroup">
                        <p:commandLink id="linkX" value="Link X" actionListener="#{sandboxBean.testCommandLinkx}" >
                            <f:ajax />
                        </p:commandLink>
                    </h:panelGroup>
                </p:tab>
                <p:tab title="Tab Two" id="tabTwo">
                    <h:panelGroup id="tabTwoGroup">
                        <p:commandLink id="linkY" value="Link Y" actionListener="#{sandboxBean.testCommandLinky}" >
                            <f:ajax /><!-- Only matters if we switch to h:commandLink -->
                        </p:commandLink>
                    </h:panelGroup>
                </p:tab>
            </p:tabView>
        </h:form>
    </h:body>
</html>

首次加载页面时,将实例化表示commandlink linkX的UIComponent,并保存“actionListener”的属性值。当我们单击“链接X”时,将再次检索此属性值并用于调用testCommandLinkx()。这很好。

当我们切换到选项卡二时,会发出一个ajax请求,在此期间,另一个表示linkY的UIComponent以相同的方式创建并保持不变。但是,当我们实际单击commandlink并尝试检索actionListener属性值时,我们发现没有这样的属性。我们收到一个全新的对象。

如果我们为tabView更改为dynamic =“false”,则在初始页面请求期间创建并保留两个命令链接,一切正常。如果我们保持dynamic =“true”但是使用h:commandLink而不是p:commandLink,一切都运行正常。

现在,我并不认为这是一个主要的错误,好像很多其他人也会注意到它。其他人也没有问题地测试了这个特定的代码片段。出于同样的原因,我怀疑这是一个webflow错误。它似乎更可能是我们项目中的配置错误,但我不知道在哪里。包含每个配置文件似乎有点冗长,但如果你想看到一个只是注释的内容,我会添加它。

对于不同组件的版本,人们无疑会问:

  • Primefaces:3.0.1以及动态tabView的所有更高版本(因为这是第一个支持它的版本),但是如果您使用另一个实例化ajax请求中的组件,则可以在早期版本中重新创建它。 / LI>
  • Mojarra:2.0.4(但我也尝试过2.0.8和2.1.6而没有改进)
  • Spring Webflow:2.2.1(也尝试过2.3)
  • Tomcat:7.0.12(已经尝试了其他各种)

1 个答案:

答案 0 :(得分:0)

此问题似乎是Spring WebFlow中的一个错误,实际上已在3月27日发布的2.3.1中修复。