カスタム制約を記述する場合、1 つのバリデーター実装で複数のアノテーションを検証することができます。たとえば、さまざまな @size 注釈を規定するいくつかの注釈がありますが、それらすべてが、いくつかのグローバル チェックを行う同じバリデータ クラスを指すようにします。つまり、すべてが特定の正規表現に一致する必要があります。私が見る限り、実装は 1 つのアノテーション タイプを取り込んでいます。
1 つの注釈
@Target( { METHOD, FIELD, ANNOTATION_TYPE, TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {UCNValidator.class})
@Documented
@Size(min = 9, max = 9, message = "{exactlength}")
public @interface UCN {
String message() default "{invalidFormat}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
String fieldName() default "ucn";
}
バリデーター
public class UCNValidator implements ConstraintValidator<UCN, String>
{
private String pattern = "[a-zA-Z].*";
private String fieldName;
@Override
public void initialize( UCN constraintAnnotation )
{
this.fieldName = constraintAnnotation.fieldName();
}
@Override
public boolean isValid( String value, ConstraintValidatorContext constraintValidatorContext )
{
if ( value != null )
{
if ( !value.matches(pattern) )
{
//do some stuff
return false;
}
}
return true;
}