Возможно ли использовать аннотацию пользовательского ограничения на уровне класса для двух разных классов

#java #hibernate #validation #javabeans

#java #впадать в спящий режим #проверка #javabeans #спящий режим

Вопрос:

У меня есть аннотация следующего ограничения:

 @Target({TYPE, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = PhoneOrEmailPresentedValidator.class)
@Documented
public @interface PhoneOrEmailPresented {

    String message() default "Either phone or email should be presented";

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

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

И валидатор:

 public class PhoneOrEmailPresentedValidator implements ConstraintValidator<PhoneOrEmailPresented, RequestDto> {

    @Override
    public boolean isValid(RequestDto value, ConstraintValidatorContext context) {
        String email = value.getEmail();
        String phone = value.getPhone();

        return (email != null amp;amp; !email.isEmpty()) ||
               (phone != null amp;amp; !phone.isEmpty());
    }

    @Override
    public void initialize(PhoneOrEmailPresented constraintAnnotation) {
        // NOP
    }
}
  

Я хотел бы использовать эту аннотацию для другого DTO, который имеет те же поля, которые представлены в isValid() методе.

Возможно ли это без извлечения интерфейса для методов get?

Ответ №1:

Поскольку в API проверки не было найдено никакого способа, проблема была решена с использованием отражения (с помощью class org.apache.commons.lang3.reflect.FieldUtils , то же самое можно сделать и с Java):

         String email, phone;

        try {
            Field emailField = FieldUtils.getField(value.getClass(), "email", true);
            Field phoneField = FieldUtils.getField(value.getClass(), "phone", true);
            email = (String) emailField.get(value);
            phone = (String) phoneField.get(value);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            return false;
        }