javax.validation to validate list of values?

前端 未结 3 717
南笙
南笙 2020-12-28 13:06

is there a way to use javax.validation to validate a variable of type string called colour that needs to have these values only(red, blue, green, pink) using annotations?

相关标签:
3条回答
  • 2020-12-28 13:36

    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
        }
    
    }
    
    0 讨论(0)
  • 2020-12-28 13:41

    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)

    0 讨论(0)
  • 2020-12-28 13:45

    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.

    0 讨论(0)
提交回复
热议问题