2012-02-29 43 views
9

En un bean administrado tengo una propiedad del tipo int.¿Cómo validar los campos numéricos con validateRegex en una página JSF?

@ManagedBean 
@SessionScoped 
public class Nacharbeit implements Serializable { 

private int number; 

En la página JSF intento validar esta propiedad para 6 dígitos de entrada numérico solamente

   <h:inputText id="number" 
         label="Auftragsnummer" 
         value="#{myController.nacharbeit.number}" 
         required="true"> 
       <f:validateRegex pattern="(^[1-9]{6}$)" /> 
      </h:inputText> 

En tiempo de ejecución puedo obtener una excepción:

javax.servlet.ServletException: java.lang.Integer cannot be cast to java.lang.String 

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String 

Es la expresión regular mal? ¿O son ValidateRegex solo para cadenas?

Respuesta

24

El <f:validateRegex> está destinado a ser utilizado en las propiedades String solamente. Pero tiene una propiedad int para la cual JSF ya convertiría el valor String enviado a Integer antes de la validación. Esto explica la excepción que estás viendo.

Pero como ya está utilizando una propiedad int, ya obtendría un error de conversión cuando ingrese dígitos que no sean dígitos. El mensaje de error de conversión es, por cierto, configurable por el atributo converterMessage. Por lo tanto, no es necesario usar expresiones regulares en absoluto.

En cuanto al requisito funcional concreto, parece que desea validar la longitud mínima/máxima. Para eso deberías estar usando <f:validateLength> en su lugar. Úselo en combinación con el atributo maxlength para que el usuario final no pueda ingresar más de 6 caracteres de todos modos.

<h:inputText value="#{bean.number}" maxlength="6"> 
    <f:validateLength minimum="6" maximum="6" /> 
</h:inputText> 

puede configurar el mensaje de error de validación por el validatorMessage por cierto. Entonces, con todo, podría verse así:

<h:inputText value="#{bean.number}" maxlength="6" 
    converterMessage="Please enter digits only." 
    validatorMessage="Please enter 6 digits."> 
    <f:validateLength minimum="6" maximum="6" /> 
</h:inputText> 
Cuestiones relacionadas