Валидатор применяется к полю в @Entity. Моя цель состоит в том, чтобы проверка выполнялась во время событий жизненного цикла Hibernate, например, перед сохранением или удалением объекта.
Однако, когда Hibernate пытается выполнить проверку, возникает следующее исключение:
jakarta.validation.ValidationException: HV000064: невозможно создать экземпляр ConstraintValidator: x.xx.xxx.util.validator.DateIsOpenValidator.
Вот реализация валидатора:
Код: Выделить всё
@RequiredArgsConstructor
public class DateIsOpenValidator implements ConstraintValidator {
private final EntryService entryService;
@Override
public boolean isValid(LocalDate date, ConstraintValidatorContext context) {
return entryService.validateDateIsOpen(date);
}
}
- Внедрение зависимостей Spring в ConstraintValidator
Spring-Boot Как правильно внедрить javax.validation.Validator
Я пропустил этап настройки или каким-то образом неправильно использую этот подход? Как я могу решить эту проблему, чтобы обеспечить правильное внедрение inputService в ConstraintValidator?
Я протестировал множество подходов, но эти являются наиболее подходящими.< /p>
Настройка валидатора с помощью LocalValidatorFactoryBean
Я настроил bean-компонент Validator по умолчанию с помощью LocalValidatorFactoryBean:: p>
Код: Выделить всё
@Bean
public LocalValidatorFactoryBean validator() {
return new LocalValidatorFactoryBean();
}
Я попытался добавить конструктор без аргументов в реализацию ConstraintValidator. Однако такой подход предсказуемо привел к нулевому EntryService:
Код: Выделить всё
public class DateIsOpenValidator implements ConstraintValidator {
private EntryService entryService;
public DateIsOpenValidator() {}
public DateIsOpenValidator(EntryService entryService) {
this.entryService = entryService;
}
@Override
public boolean isValid(LocalDate date, ConstraintValidatorContext context) {
if (entryService == null) {
throw new IllegalStateException("EntryService has not been initialized");
}
return entryService.validateDateIsOpen(date);
}
}
Скажите Hibernate, чтобы он соответствовал валидатору
Как указано в этом вопросе о переполнении стека мы можем указать Hibernate, какой валидатор использовать, следующим образом:
Код: Выделить всё
@Bean
@Lazy
public HibernatePropertiesCustomizer hibernatePropertiesCustomizer(final Validator validator) {
return hibernateProperties ->
hibernateProperties.put("jakarta.persistence.validation.factory", validator);
}
- LocalValidatorFactoryBean сама по себе не решает проблему.
- Добавление конструктора без аргументов «обходит» исключение создания экземпляра ConstraintValidator, но не позволяет внедрить зависимости.
- Это работает на поверхности; У меня почти возникает соблазн ответить на свой вопрос и принять ответ, но я подозреваю, что что-то упускаю из-за отсутствия информации в Интернете.
Подробнее здесь: https://stackoverflow.com/questions/791 ... validation