javax.validation to validate list of values?
Asked Answered
G

4

54

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?

i have seen @size(min=1, max=25) and @notnull but is there something like this @In(red, blue, green, pink)

more or less similar to the In-keyword used in mysql

Guadalupe answered 7/2, 2011 at 14:52 Comment(1)
Hi. i am guessing this is not possible using javax validators then? i suppose i can just create a constraint on the table/database level?Guadalupe
A
128

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)

Alhambra answered 24/1, 2013 at 12:55 Comment(3)
what if the red blue etc are a constant?Glade
does it allow also empty values ?Baden
@Glade did you get a solution to use Pattern annotation for using constants in the regexp? e.g. AppConstants.RED, AppConstants.BLUE etcBrickwork
R
12

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
    }

}
Rella answered 3/3, 2011 at 9:50 Comment(1)
Useful when trying to validate list of char, but you can't define 'values' as an array of objects. Compiler gives this error: 'Invalid type Object[] for the annotation attribute In.values; only primitive type, String, Class, annotation, enumeration are permitted or 1-dimensional arrays thereof'Richelieu
S
3

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.

Siphonostele answered 16/10, 2017 at 11:34 Comment(1)
I don't think so. @Enumerated is a javax.persistence annotation, not a javax.validation annotation.Jahdol
J
1

You can create your validation class by your own. for reference https://www.javatpoint.com/spring-mvc-custom-validation

Jolley answered 30/4, 2021 at 10:48 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.