Я знаю другой способ проверить это.
Внутри вашего контроллера вы можете зарегистрировать валидатор.
@InitBinder
public void setup(WebDataBinder webDataBinder) {
webDataBinder.addValidators(dtoValidator);
}
Где dtoValidator, например, является экземпляром Spring Bean, который должен реализовывать org.springframework.validation.Validator.
Итак, вам просто нужно реализовать два метода: support () и validate (объектная цель, ошибки ошибок);
Внутри метода support () вы можете делать все, что захотите, чтобы решить, должен ли объект проверяться этим валидатором или нет. (например, вы можете создать интерфейс WithClientIdDto и, если тестируемый объект isAssignableFrom () этот интерфейс, вы можете выполнить эту проверку. Или вы можете проверить, представлена ли ваша пользовательская аннотация в любом поле с использованием отражения)
Например: (AuthDtoValidator.class)
@Override
public boolean supports(Class<?> clazz) {
return AuthDto.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {
final AuthDto dto = (AuthDto) target;
final String phone = dto.getPhone();
if (StringUtils.isEmpty(phone) && StringUtils.isEmpty(dto.getEmail())) {
errors.rejectValue("email", "", "The phone or the email should be defined!");
errors.rejectValue("phone", "", "The phone or the email should be defined!");
}
if (!StringUtils.isEmpty(phone)) {
validatePhone(errors, phone);
}
}
UPDATE:
Вы можете сделать это.
Создать аннотацию
например:
@Target({ FIELD })
@Retention(RUNTIME)
@Constraint(validatedBy = ClientIdValidator.class)
@Documented
public @interface ClientId {
String message() default "{some msg}";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
и реализовать этот валидатор:
class ClientIdValidator implements ConstraintValidator<ClientId, Long> {
@Override
public boolean isValid(Long value, ConstraintValidatorContext context) {
//validation logc
}
}
Подробнее вы можете найти здесь: https://reflectoring.io/bean-validation-with-spring-boot/