2012-01-08 14 views
5

Devo registrare un validatore personalizzato in faces-config.xml se sto usando JSF 2.0.4? Il mio validatore personalizzato utilizza l'interfaccia di convalida che è javax.faces.validator.Validator.Come specificare un validatore per un componente di input all'interno di un componente composito?

<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

Sembra che tu stia utilizzando un componente personalizzato o un componente composito. Devi mostrare come lo hai creato. Forse semplicemente non hai delegato correttamente il validatore. – BalusC

risposta

5

Come per l'esempio di codice nella tua domanda aggiornato, sembra che non deleghi affatto il validatore all'input giusto, quindi il validatore viene semplicemente ignorato del tutto.

È necessario definire l'input desiderato (per il quale si desidera allegare un validatore) come <composite:editableValueHolder> nello <composite:interface>.

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

È possibile che questo <composite:editableValueHolder> dice fondamentalmente che qualsiasi <f:validator for="forName"> deve essere applicato sul <h:inputText id="inputId">. Così, il seguente dovrebbe poi farlo:

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

si può anche utilizzare lo stesso valore in name e targets, ma il punto chiave è che ci deve essere una <composite:editableValueHolder> presente in modo che JSF sa su cosa componente di ingresso esattamente la il validatore dovrebbe essere mirato, ci può essere più di un componente di input nel composito, vedete.

+0

Grazie mille! –

+0

Prego. – BalusC

+0

1up per te e Chichiray. :) –

1

No. Non è necessario con Jsf 2.0. Annota il tuo validatore con @FacesValidator. L'annotazione registra automaticamente il tuo validatore. Non è necessario xml.

+0

Per qualche motivo il mio validatore non funziona. Si prega di verificare la modifica –

3

Se si lavora con JSF 2, non credo sia necessario toccare il file faces-config.xml per creare un cliente Validator. È sufficiente utilizzare l'annotazione @FacesValidator per dichiarare un Validator. Dovrebbe essere qualcosa di simile:

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

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

} 

allora si può iniziare ad usarlo nella tua pagina .xhtml con, per esempio, <f:validator> tag:

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

Ho fatto esattamente come menzionato sopra nella classe myValidator ma ancora non viene chiamato. –

+0

Si prega di controllare l'aggiornamento nella mia domanda. –

+1

@Altair: puoi pubblicare il codice per il tuo 'Validator' e il tuo componente composito? Un 'Validator' dovrebbe essere registrato per un singolo input, non l'intero componente. –

Problemi correlati