2012-07-27 44 views
2

我在JSF 2.1香草(在glassfish 3.1上)中有一個複合組件的問題。我的問題的簡化版本是在這裏:param對bean沒有傳入複合組件的引用

[複合構件]

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html 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:f="http://java.sun.com/jsf/core" 
     xmlns:c="http://java.sun.com/jsp/jstl/core" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:p="http://primefaces.org/ui" 
     xmlns:cc="http://java.sun.com/jsf/composite"> 

    <!-- INTERFACE --> 
    <cc:interface> 

      <cc:attribute name="value" required="true"/> 
      <cc:attribute name="title" required="false" default=""/> 

      <cc:editableValueHolder name="inputTarget" targets="labeledInputField"/> 

    </cc:interface> 

    <!-- IMPLEMENTATION --> 
    <cc:implementation> 

      <p:inputText id="labeledInputField" 
       label="#{cc.attrs.title}" 
       value="#{cc.attrs.value}" 
       title="#{cc.attrs.title}"> 

       <cc:insertChildren/> 

      </p:inputText> 

    </cc:implementation> 
</html> 

[實施中]

   <!-- thisPerson is passed in via ui:param to the facelet containing this code. 
       it works in other (non-composite) components on the page --> 

       <comp:labeledInputText 
        id="baseUsername" 
        value="#{controller.username}" 
        title="#{bundle.Username}"> 

        <f:validator for="inputTarget" binding="#{thisPerson.usernameValidator}"/> 
        <f:converter for="inputTarget" converterId="#{whiteSpaceTrimConverter}"/> 

       </comp:labeledInputText> 

問題,所述 「thisPerson.usernameValidator」 正在評估爲NULL,然後導致com.sun.faces.facelets.tag.jsf.ValidatorTagHandlerDelegateImpl然後跳到試圖通過「validatorID」加載驗證程序的代碼,該驗證程序未設置,因爲我們試圖通過「綁定」。有沒有辦法讓組合評估ui:param值,或者是一種不需要重新驗證驗證器的解決方法(這是一個巨大的反模式,我現在沒有時間扭轉損傷)。假定驗證器HAS通過綁定進入。

我知道複合材料的工作原理,因爲在不同的facelet中,我有驗證器綁定在一個具體的bean引用上,而不是「軟」引用,它就像一個冠軍。

TIA

回答

2

不知道你的確切JSF實現,我將承擔鑽嘴魚科,你可能會運行到以下已知的bug。

http://java.net/jira/browse/JAVASERVERFACES-2040

不管這是否是您的具體問題或沒有,你可以嘗試禁用部分狀態保存,看看是否能解決您的問題。如果確實如此,那意味着你正面臨着這個問題,這顯然是在Mojarra後期版本中(固定的)。

另一種可能性是簡單地使用renderFacet而不是insertChildren並以facet的形式插入驗證器。

+0

我會嘗試renderFacet方法並報告我的結果。感謝這個想法。 /使用facet的十字手指 – him 2012-07-27 20:05:08

+0

沒有幫助。我猜這是一個階段性時間問題(CC可能在param可用之前就已經構成了)。不幸的。爲了防止有人知道功能性解決方法,我將會離開這個「未回答」。 – him 2012-07-27 20:48:49

+0

即使沒有「解決辦法」,這是對這個問題的一個很好的評論 – him 2018-02-22 18:32:45