#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;
}