2012-02-13 15 views
7

Estoy utilizando la validación basada en la anotación de Spring 3. Quiero añadir una tras la validación de campos StringY/O condición en la validación basada en la anotación de primavera

El campo puede ser nulo O éste debe contener una cadena no vacía

Sé anotación como @Null, @NotEmpty pero ¿cómo puedo usar tanto con una condición O?


Solución:

Usando @Size(min=1) ayuda pero no manejan espacios. Por lo tanto, agregó una anotación personalizada NotBlankOrNull que permitirá null y cadenas no vacías también se ocupa de los espacios en blanco. Muchas gracias @Ralph.
Aquí es mi clase de anotación

@Documented 
@Constraint(validatedBy = { NotBlankOrNullValidator.class }) 
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) 
@Retention(RUNTIME) 
public @interface NotBlankOrNull { 
    String message() default "{org.hibernate.validator.constraints.NotBlankOrNull.message}"; 

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

    Class<? extends Payload>[] payload() default { }; 
} 

Validador

public class NotBlankOrNullValidator implements ConstraintValidator<NotBlankOrNull, String> { 

    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) { 
     if (s == null) { 
      return true; 
     } 
     return s.trim().length() > 0; 
    } 

    @Override 
    public void initialize(NotBlankOrNull constraint) { 

    } 
} 

También he actualizado en mi site.

Respuesta

5

En primer lugar, no es la validación basada en la anotación de primavera, es JSR 303 Bean Validation, implementado, por ejemplo, por Hibernate Validation. Realmente no está relacionado con la primavera/

No se pueden combinar las anotaciones de forma OR *.

Pero hay una solución simple para la restricción no nula, porque las validaciones más básicas aceptan nulo como una entrada válida (por lo tanto, a menudo necesita combinar las variables básicas y una @NotNull adicional, si desea tener un " "comportamiento normal" pero no lo que pediste).

Por ejemplo: @javax.validation.constraints.Size aceptan nulo como una entrada válida.

Así que lo que necesita en su caso es usar @Size(min=1) en lugar de @NotEmpty.

BTW: No @NotEmpty es sólo una combinación de @NotNull y @Size(min = 1)

* excepto a implementar por su cuenta propia.

+0

Muchas gracias sugerencia y corregirme. Intenté '@Size (min = 1)' y funciona para 'null' y cadenas no vacías. Me pregunto cómo tratar si el usuario ingresa espacios? – xyz

+0

@Ajinkya: eche un vistazo al código fuente de NotBlank Annotation. Nuevamente se anota con NotNull. Pero está validado por NotBlankValidator (por fortuna, el NotBlankValidator devuelve verdadero (válido) para nulo). Por lo tanto, necesita su propia anotación pero puede reutilizar la implementación de Validator> '@Constraint (validatedBy = {NotBlankValidator.class}) @ Target ... @ Retention ... public @interface NotBlankOrNull' – Ralph

+0

Muchas gracias man :) – xyz

Cuestiones relacionadas