2015-08-25 63 views
2

我正在寫一個包含<h:selectManyMenu>的複合成分,我想,讓這個組件的客戶端通過將<f:validator><f:converter>的標籤,我的複合成分的標籤的兒童提供驗證器和轉換器。在我複合材料的界面部分,我有JSF 2.2複合組件EditableValueHolder的

<composite:editableValueHolder name="select-input" targets="select-many" /> 

,並實現部分:

<h:selectManyMenu id="select-many" styleClass="hidden select-input" value="#{cc.attrs['value']}" binding="#{cc.inputComponent}"> 
    <composite:insertChildren /> 
</h:selectManyMenu> 

終於用法:

<cwi:selectManyMenu id="select-many-menu" value="#{selectManyBean.selectedItems}"> 
    <f:converter converterId="converter.testItem" for="select-many" /> 
    <f:validator validatorId="validator.testItem" for="select-input" /> 
    <f:selectItems value="#{selectManyBean.possibleItems}" var="item" itemValue="#{item}" itemLabel="#{item.description}" /> 
</cwi:selectManyMenu> 

問題既不驗證,也沒有轉換器被調用。我也有驗證器和轉換器類,每個類分別註釋爲@FacesValidator('validator.testItem')@FacesConverter("converter.testItem")。他們被正確地拾起,因爲如果我移動複合材料部件內<f:validator><f:converter>標籤,下面<composite:insertChildren>一切工作正常,但我寧願這些暴露給客戶比他們硬編碼。有什麼關於insertChildren在使用editableValueHolder時的工作方式?爲了達到這個目的,我可以將轉換器和驗證器ID作爲接口的一部分,但是將屬性傳遞給轉換器和驗證器失去了一些靈活性。

+0

哪個JSF IMPL /版本?在將中的「顯而易見的」錯誤修正爲一個你已經在'中正確使用的值之後,它對Mojarra 2.2.12中的我來說工作得很好。 – BalusC

回答

2

我使用鑽嘴魚科2.2.8-jbossorg-1。除了現在明顯的錯字,我還應該包括更多我的複合組件的xhtml。我使用的是支持組件,沒有支持組件,一旦我修正了錯字,一切正常,但是當我添加支持組件時,驗證器和轉換器停止工作。

這裏查看wiki頁面的複合材料構件https://stackoverflow.com/tags/composite-component/info後,我意識到支持組件複合組件是不一樣的類的自定義組件。對於複合組件,它們應該始終只擴展UINamingContainer。我的錯誤,特別是這個selectManyMenu,是我的支持組件擴展了UISelectMany。

+0

您可以擴展'UISelectMany'和落實'NamingContainer'並覆蓋'getFamily()'返回'UINamingContainer.COMPONENT_FAMILY'。 – BalusC