2011-05-14 9 views
10

¿Cómo puedo usar la restricción @Pattern en campos de formulario no obligatorios?Cómo usar @Pattern en campos no obligatorios JSR 303

@Pattern(regexp="...") 
private String something; 

tan pronto como me presento mi forma, me sale error de validación como se esperaba, pero el usuario puede dejar el campo vacío, ya que esto no es un campo obligatorio.

PD: podría escribir mi propia anotación de restricción. Sin embargo, solo te pido una forma más fácil de combinar anotaciones o agregar atributos de anotación. La implementación de JSR303 es hibernate-validator.

Respuesta

6

Simplemente configúrelo con null en lugar de cadena vacía. Como los campos de entrada HTML vacíos se envían por defecto como una cadena vacía como parámetro de solicitud HTTP, debe permitir que su MVC interprete los valores enviados como null. Esto es en JSF fácil de hacer por un <context-param> en web.xml. Sin embargo, dado que está utilizando Spring MVC y no lo hago, busqué un poco aquí y encontré this answer que puede ser de utilidad.

+0

y sería válida tanto el ajuste de patrones y nula? es decir, las dos entradas son válidas nulas (en mi caso, vacías) y el texto coincide con expresiones regulares. Me gustaría que el validador siga siendo una falla de validación, ya que el patrón no coincidirá, si es nulo. –

+1

Si el valor es 'nulo', entonces' @ Pattern' no se probará. Solo se probará '@ NotNull' (y' 'NotEmpty' específico de Hibernate). – BalusC

+0

increíble, gracias! –

3

Otra forma de solucionar este problema es permitir la cadena vacía como valor válido alternativo en su expresión regular (usando "|").

Como dijo BalusC en JSF 2, es posible convertir cadenas vacías automáticamente en nulas. El parámetro de contexto para usar es "javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL", que debe establecerse en "true" (consulte también este answer).

0

Añadir una restricción vacía es la mejor manera de hacerlo. En esta restricción, agrega su propio @Pattern como restricción de composición.

@Target({ANNOTATION_TYPE, FIELD}) 
@Retention(RUNTIME) 
@Documented 
**@Pattern(regexp="...")** 
@Constraint(validatedBy = EmptyValueConstraintValidator.class) 
public @interface EmptyValueConstraint { 
    String message() default "{defaultMessage}"; 

    Class<?>[] groups() default {}; 

    Class<? extends Payload>[] payload() default {}; 
    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) 
    @Retention(RUNTIME) 
    @Documented 
    @interface List { 
     EmptyValueConstraint[] value(); 
    } 
} 

public class EmptyValueConstraintValidator implements  
ConstraintValidator<EmptyValueConstraint, Object>{ 

    @Override 
    public void initialize(EmptyValueConstraint constraintAnnotation) { 

    } 

    @Override 
    public boolean isValid(Object value, ConstraintValidatorContext context) { 

     return true; 
    } 



} 

Espero que esto ayude ..

Cuestiones relacionadas