2011-02-07 26 views
12

¿Hay alguna manera de usar javax.validation para validar una variable de tipo cadena llamada color que necesita tener estos valores solamente (rojo, azul, verde, rosa) usando anotaciones?javax.validation para validar la lista de valores?

que he visto @size (min = 1, max = 25) y @notnull pero ¿hay algo como esto @In (rojo, azul, verde, rosa)

más o menos similar a la "En "palabra clave utilizada en mysql

+0

Hola. Supongo que esto no es posible usando validadores javax entonces? ¿Supongo que puedo crear una restricción en el nivel de la tabla/base de datos? – jonney

Respuesta

28

En ese caso, yo creo que sería más fácil de usar la anotación @Pattern, al igual que el fragmento a continuación. Si desea que un caso de evaluación insensible, sólo tiene que añadir la bandera correspondiente:

@Pattern(regexp = "red|blue|green|pink", flags = Pattern.Flag.CASE_INSENSITIVE)

8

Puede crear una anotación de validación personalizada. Voy a escribir aquí (código no probado!):

@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) 
@Retention(RUNTIME) 
@Documented 
@Constraint(validatedBy = InConstraintValidator.class) 
public @interface In 
{ 
    String message() default "YOURPACKAGE.In.message}"; 

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

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

    Object[] values(); // TODO not sure if this is possible, might be restricted to String[] 
} 

public class InConstraintValidator implements ConstraintValidator<In, String> 
{ 

    private Object[] values; 

    public final void initialize(final In annotation) 
    { 
     values = annotation.values(); 
    } 

    public final boolean isValid(final String value, final ConstraintValidatorContext context) 
    { 
     if (value == null) 
     { 
      return true; 
     } 
     return ...; // check if value is in this.values 
    } 

} 
+0

Útil al tratar de validar la lista de caracteres, pero no puede definir 'valores' como una matriz de objetos. El compilador proporciona este error: 'Objeto de tipo inválido [] para el atributo de anotación In.values; solo se permite el tipo primitivo, cadena, clase, anotación, enumeración o matrices unidimensionales ' – maureyes

0

puede crear una enumeración

public enum Colors { 
    RED, PINK, YELLOW 
} 

y luego en su modelo, puede validarlo así:

public class Model { 
    @Enumerated(EnumType.STRING) 
    private Colors color; 
} 

que validará su carga útil contra la enumeración, teniendo en cuenta que ha agregado @Valid en su Res tController.

Cuestiones relacionadas