2012-01-08 21 views
5

¿Debo registrar un validador personalizado en faces-config.xml si estoy usando JSF 2.0.4? Mi validador personalizado usa la interfaz Validator que es javax.faces.validator.Validator.¿Cómo se especifica un validador para un componente de entrada dentro de un componente compuesto?

<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

Parece que está utilizando un componente personalizado o un componente compuesto. Debes mostrar cómo lo has creado. Quizás simplemente no delegó el validador correctamente. – BalusC

Respuesta

5

Según el ejemplo de código en su pregunta actualizada, parece que no está delegando el validador en la entrada correcta, por lo que el validador simplemente se ignora por completo.

Debe definir la entrada deseada (para la que desea adjuntar un validador) como <composite:editableValueHolder> en el <composite:interface>.

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

Lo anterior <composite:editableValueHolder> básicamente dice que cualquier <f:validator for="forName"> se debe aplicar en el <h:inputText id="inputId">. Por lo tanto, la siguiente continuación, debe hacerlo:

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

incluso se puede utilizar el mismo valor en name y targets, pero el punto clave es que debe haber un presente <composite:editableValueHolder> modo que JSF sabe de qué componente de entrada exactamente el El validador debe estar dirigido, puede haber más de un componente de entrada en el compuesto, ¿sabe?

+0

¡Muchas gracias! –

+0

De nada. – BalusC

+0

1 para ti y Chichiray. :) –

1

No. Eso no es necesario con Jsf 2.0. Simplemente anote su validador con @FacesValidator. La anotación registra su validador automáticamente. No se necesita xml

+0

Por alguna razón, mi validador no funciona. Por favor, compruebe la edición –

3

Si está trabajando con JSF 2, no creo que necesite tocar el archivo faces-config.xml para crear un cliente Validator. Simplemente puede usar la anotación @FacesValidator para declarar Validator. Debe ser algo como esto:

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

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

} 

entonces se puede empezar a usarlo en su página .xhtml con, por ejemplo, <f:validator> etiqueta:

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

. Hice exactamente lo mencionado anteriormente en la clase myValidator pero todavía no se está llamando. –

+0

Por favor revise la actualización en mi pregunta. –

+1

@Altair: ¿puede publicar el código de su 'Validator', así como su componente compuesto? Un 'Validator' debe registrarse para una sola entrada, no para todo el componente. –

Cuestiones relacionadas