2012-01-08 31 views
5

如果我使用JSF 2.0.4,我應該在faces-config.xml中註冊一個自定義驗證器嗎? 我的自定義驗證器使用的驗證器接口是javax.faces.validator.Validator如何爲複合組件內的輸入組件指定驗證程序?

<cc:myComp id="customcomp1" ... /> 

<cc:myComp id="customcomp2" ...> 
    <f:validator id="myvalidator" for="myComp" /> 
</cc:myComp> 

myComp.xhtml

<cc:interface> 
    <cc:attribute ... /> 
    <!-- more attributes --> 
</cc:interface> 
<cc:implementation> 
    <h:panelGroup layout="block"> 
     <h:inputText id="firstName" ... /> 
     <h:inputText id="middleName" ... /> 
     <h:inputText id="lastName" ... /> 
    </h:panelGroup> 
</cc:implementation> 
+0

您似乎在使用自定義組件或複合組件。你需要展示你是如何創建它的。也許你根本沒有正確地委託驗證器。 – BalusC 2012-01-09 12:10:53

回答

5

按照代碼示例中更新的問題,你似乎沒有將驗證器委託給正確的輸入,因此驗證器完全被忽略。

您需要在<composite:interface>中將所需的輸入(您希望附加驗證器)定義爲<composite:editableValueHolder>

<cc:interface> 
    <cc:editableValueHolder name="forName" targets="inputId" /> 
    ... 
</cc:interface> 
<cc:implementation> 
    ... 
    <h:inputText id="inputId" ... /> 
    ... 
</cc:implementation> 

上面<composite:editableValueHolder>基本上告訴任何<f:validator for="forName">必須在<h:inputText id="inputId">來施加。因此,下面應該那麼做:

<cc:myComp> 
    <f:validator id="myValidator" for="forName" /> 
</cc:myComp> 

,你甚至可以在nametargets使用相同的值,但關鍵的一點是,必須有一個<composite:editableValueHolder>出現在什麼樣的輸入組件,以便JSF確切地知道了驗證程序應該是有針對性的,組合中可以有多個輸入組件,您會看到。

+0

非常感謝! – 2012-01-09 15:41:33

+0

不客氣。 – BalusC 2012-01-09 15:42:19

+0

1up for you和Chichiray。 :) – 2012-01-09 15:50:16

1

即沒有必要使用JSF 2.0。只需用@FacesValidator註釋驗證者即可。註釋會自動註冊您的驗證器。不需要xml。

+0

由於某種原因,我的驗證器不起作用。請檢查編輯 – 2012-01-09 04:12:48

3

如果您正在使用JSF 2,我認爲您不需要觸摸faces-config.xml文件來創建客戶Validator。您可以簡單地使用註釋@FacesValidator來聲明Validator。它應該是這樣的:

@FacesValidator("myValidator") 
public class MyValidator implements Validator { 

    @Override 
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { 
     // Your logic 
    } 

} 

然後你就可以開始使用它在你的.xhtml頁面,例如,<f:validator>標籤:

<f:validator validatorId="myValidator" /> 
+0

我完全按照上面在myValidator類中提到的方式,但仍然沒有被調用。 – 2012-01-09 04:19:51

+0

請檢查我的問題中的更新。 – 2012-01-09 04:21:54

+1

@Altair:你能發佈你的'Validator'和你的複合組件的代碼嗎?應該爲單個輸入註冊一個「驗證器」,而不是整個組件。 – 2012-01-09 05:17:25