Вручную проверить с помощью пользовательского валидатора без конструктора по умолчанию

У меня есть пользовательская проверка с такими аннотациями, как:

@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. Таким образом, подсказка о том, как заставить это работать, также будет вполне приемлемым ответом.

Спасибо!


person Hasan Can Saral    schedule 13.04.2017    source источник


Ответы (1)


Создайте конструктор по умолчанию для UniquePropertyValidator и добавьте аннотацию @Component. Затем просто добавьте

@Inject
private DataSource dataSource;

для ввода источника данных, а не для его инициализации из конструктора. (Подробнее об автоматическом связывании объектов в валидаторе)

UPDATE вы можете получить компонент из контекста (см. Spring получить текущий ApplicationContext)

person StanislavL    schedule 13.04.2017
comment
Разве Spring не всегда создает новый экземпляр с adapter.validate(propertyClass, result, UniquePropertyClass.SomeValidationGroup.class); вместо использования того, который присутствует в контексте приложения, когда я использую @Component? Или он только создаст новый, так как не смог найти его в контексте приложения? - person Hasan Can Saral; 13.04.2017
comment
Он использовал тот, который находится в контексте приложения, вместо создания нового. Спасибо! - person Hasan Can Saral; 13.04.2017