我遇到了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错误。它似乎更可能是我们项目中的配置错误,但我不知道在哪里。包含每个配置文件似乎有点冗长,但如果你想看到一个只是注释的内容,我会添加它。
对于不同组件的版本,人们无疑会问:
答案 0 :(得分:0)
此问题似乎是Spring WebFlow中的一个错误,实际上已在3月27日发布的2.3.1中修复。