У меня есть пользовательская проверка с такими аннотациями, как:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = UniquePropertyValidator.class)
public @interface UniqueProperty {
String message() default "sample message";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
вот мой валидатор:
public class UniquePropertyValidator extends JdbcDaoSupport implements ConstraintValidator<UniqueProperty, UniquePropertyClass> {
@Inject public UniquePropertyValidator(DataSource dataSource) {
setDataSource(dataSource);
}
@Override
public void initialize(UniqueProperty property) {
}
@Override
public boolean isValid(UniquePropertyClass propertyClass, ConstraintValidatorContext constraintValidatorContext) { return some boolean; }
}
и я пытаюсь использовать его следующим образом:
SpringValidatorAdapter adapter = new SpringValidatorAdapter(validator);
BeanPropertyBindingResult result = new BeanPropertyBindingResult(propertyClass, propertyClass.getClass().getName());
adapter.validate(propertyClass, result, UniquePropertyClass.SomeValidationGroup.class);
if (result.hasErrors())
throw new MethodArgumentNotValidException(null, result);
однако я получаю эту ошибку:
HV000064: Unable to instantiate ConstraintValidator: class some.package.UniquePropertyValidator.
Теперь я хорошо знаю, что мой класс валидатора не имеет конструктора по умолчанию без каких-либо параметров метода. Однако следующее работает с точной аннотацией и валидатором:
public someMethod(@Validated(value = UniquePropertyClass.SomeValidationGroup.class) @RequestBody UniquePropertyClass propertyClass)
Я спрашиваю; есть ли способ вручную проверить без конструктора по умолчанию.
P.S. Причина, по которой я не могу использовать @Validated
(рабочий пример выше):
У меня есть @PathVariable
(скажем, id
), и перед проверкой объекта @RequestBody UniquePropertyClass propertyClass
мне нужно установить id
объекта UniquePropertyClass
перед его проверкой, так как я не смог найти способ привязать @PathVariable
к полю @RequestBody
и проверить на лету с помощью @Validated
. Таким образом, подсказка о том, как заставить это работать, также будет вполне приемлемым ответом.
Спасибо!