Повторное использование пользовательского валидатора гибернации в 2 разных контекстах - PullRequest
2 голосов
/ 03 апреля 2020

У меня есть следующий пользовательский валидатор гибернации в сборке приложения с весенней загрузкой 2.1.5.

public class MyValidator implements ConstraintValidator<MyValidAnnotation, DTO> {
    @Autowired
    private MyBean myBean;

     @Override
    public boolean isValid(DTO dto, ConstraintValidatorContext constraintValidatorContext) {
        // logic
    }
}

Мне нужно использовать этот валидатор в 2 случаях, в методе isValid мне нужно пропустить некоторые проверки. Я нашел решение для установки параметра в ConstraintValidatorContext с помощью следующего кода:

HibernateValidatorFactory hibernateValidatorFactory = Validation.buildDefaultValidatorFactory()
                .unwrap( HibernateValidatorFactory.class );

Validator validator = hibernateValidatorFactory.usingContext()
                .constraintValidatorPayload(RepairEstimateDTO.class.getSimpleName())
                .getValidator();

validator.validate(dto);

Проблема в том, что MyBean не вводится, в методе isValid myBean имеет значение null.

Как я могу повторно использовать этот валидатор в 2 контекстах без дублирования кода?

Спасибо

1 Ответ

0 голосов
/ 03 апреля 2020

Я думаю, этот фрагмент кода решит вашу проблему:

@Bean
public Validator validator ( AutowireCapableBeanFactory autowireCapableBeanFactory) {

    ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )
        .configure().constraintValidatorFactory(new SpringConstraintValidatorFactory(autowireCapableBeanFactory))
        .buildValidatorFactory();
    Validator validator = validatorFactory.getValidator();

    return validator;
}

Скопировано из: Autowired дает нулевое значение в валидаторе Custom Constraint

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...