Annotation Interface Constraint


@Documented @Target(ANNOTATION_TYPE) @Retention(RUNTIME) public @interface Constraint
Marks an annotation as being a Jakarta Validation constraint.

A given constraint annotation must be annotated by a @Constraint annotation which refers to its list of constraint validation implementations.

Each constraint annotation must host the following attributes:

  • String message() default [...]; which should default to an error message key made of the fully-qualified class name of the constraint followed by .message. For example "{com.acme.constraints.NotSafe.message}"
  • Class<?>[] groups() default {}; for user to customize the targeted groups
  • Class<? extends Payload>[] payload() default {}; for extensibility purposes

When building a constraint that is both generic and cross-parameter, the constraint annotation must host the validationAppliesTo() property. A constraint is generic if it targets the annotated element and is cross-parameter if it targets the array of parameters of a method or constructor.

     ConstraintTarget validationAppliesTo() default ConstraintTarget.IMPLICIT;
 
This property allows the constraint user to choose whether the constraint targets the return type of the executable or its array of parameters. A constraint is both generic and cross-parameter if Such dual constraints are rare. See SupportedValidationTarget for more info.

Here is an example of constraint definition:

 @Documented
 @Constraint(validatedBy = OrderNumberValidator.class)
 @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
 @Retention(RUNTIME)
 public @interface OrderNumber {
     String message() default "{com.acme.constraint.OrderNumber.message}";
     Class<?>[] groups() default {};
     Class<? extends Payload>[] payload() default {};
 }