javax.validation to validate list of values?
In that case I think it would be simpler to use the @Pattern annotation, like the snippet below. If you want a case insensitive evaluation, just add the appropriate flag:
@Pattern(regexp = "red|blue|green|pink", flags = Pattern.Flag.CASE_INSENSITIVE)
You can create a custom validation annotation. I will write it here (untested code!):
@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 }}
you can create an enum
public enum Colors { RED, PINK, YELLOW}
and then in your model, you can validate it like so:
public class Model { @Enumerated(EnumType.STRING) private Colors color;}
which will validate your payload against the enum, given that you have added @Valid in your RestController.