Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Define custom validation annotation that extends an existing one - javaEE

I want to define a custom @DateOfBirthValid validation annotation that makes use of @Pattern annotation so that I define the date of birth pattern once and use it wherever ... I know I can define it using @Constraint(validatedBy = SomeClass.class) then define the isValid() method inside SomeClass but I wonder if there is a more direct way to use the @Pattern annotation and give it the date of birth regex I want ... the reason is that I want to use the same validation annotation in many places in the code without defining the pattern again

like image 868
osama yaccoub Avatar asked Dec 08 '25 20:12

osama yaccoub


1 Answers

From https://docs.oracle.com/javaee/6/tutorial/doc/gkfgx.html:

Bean Validation includes several built-in constraints that can be combined to create new, reusable constraints. This can simplify constraint definition by allowing developers to define a custom constraint made up of several built-in constraints that may then be applied to component attributes with a single annotation.

In the example in the link you can see how @Pattern is used (amongst others) to create an Email validation annotation:

@Pattern.List({
  @Pattern(regexp = "[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\."
    +"[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*"
    +"@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?")
})
@Constraint(validatedBy = {})
@Documented
@Target({ElementType.METHOD,
    ElementType.FIELD,
    ElementType.ANNOTATION_TYPE,
    ElementType.CONSTRUCTOR,
    ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface Email {

    String message() default "{invalid.email}";

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

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

    @Target({ElementType.METHOD,
        ElementType.FIELD,
        ElementType.ANNOTATION_TYPE,
        ElementType.CONSTRUCTOR,
        ElementType.PARAMETER})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @interface List {
        Email[] value();
    }
}

So from my (rather limited) understanding of this you should be able to create a new annotation similar to this

@Pattern(regexp = yourRegex)
@Documented
@Target(/* all targets here */)
@Retention(RetentionPolicy.RUNTIME)
public @interface DateOfBirthValid {
    /* all methods required */
    /* Same thing for the List interface */
}

Which then should be usable like

@DateOfBirthValid
protected String myString

or for the example from the link

This custom constraint can then be applied to an attribute.

...
@Email
protected String email;
...
like image 139
geisterfurz007 Avatar answered Dec 11 '25 02:12

geisterfurz007



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!