2012-03-23 57 views
0

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

<!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被实例化并关于“的ActionListener”的属性值在UIComponent被保存。当我们点击“链接X”时,该属性值再次被检索并用于调用testCommandLinkx()。这工作正常。

当我们切换到Tab Two时,发出ajax请求,在此期间,另一个表示linkY的UIComponent以相同的方式创建并保留。但是,当我们实际点击命令链接并尝试检索actionListener属性值时,我们发现没有这样的属性。相反,我们会收到一个全新的对象。

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

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

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

  • Primefaces:3.0.1和所有更高版本的动态tabViews(因为这是支持它真正的第一个版本),但它可能在早期版本中重新创建它,如果您使用另一个实例化Ajax请求中的组件的构造。
  • 钻嘴鱼科:2.0.4(但我自己也尝试2.0.8和2.1.6无改善)
  • 春天的Webflow:2.2.1(也试图2.3)
  • 的Tomcat:7.0.12(曾尝试各种其他)
+0

尝试将''替换为''。此外''''标签是不必要的。所有的PrimeFaces命令链接/按钮默认已经被设置为ajaxified,应该由接受布尔值的'ajax'属性配置。 – BalusC 2012-03-23 11:53:06

+0

切换表格并不会改变任何恐惧。 p:commandLink不需要,但它确保在切换到h:commandLink时功能相同。我不希望人们认为h:commandLink工作的原因是它不是ajax请求。 – MatsT 2012-03-23 12:40:00

+0

您能否详细说明*“但是,当我们实际点击命令链接并尝试检索actionListener属性值时,我们发现没有这样的属性,我们反而会收到一个全新的对象。你的意思是你从动作侦听器方法中的视图根(或从动作事件参数)中检索组件,然后尝试通过'getValue()'从它获取命令组件的值?如果是这样,为什么? – BalusC 2012-03-26 14:07:07

回答

0

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