2012-03-23 32 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中修復。