Невозможно внедрить службу в ConstraintValidator: jakarta.validation.ValidationException HV000064.JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Невозможно внедрить службу в ConstraintValidator: jakarta.validation.ValidationException HV000064.

Сообщение Anonymous »

Я пытаюсь настроить собственный ConstraintValidator, чтобы проверять допустимость LocalDate, делегируя логику проверки службе.
Валидатор применяется к полю в @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);
}
}
Исключение предполагает, что экземпляр валидатора не может быть создан. Насколько я понимаю, использование внедрения зависимостей для ConstraintValidator возможно, как описано в следующих источниках:
  • Внедрение зависимостей Spring в ConstraintValidator
    Spring-Boot Как правильно внедрить javax.validation.Validator
Кроме того, в документации Spring Framework указано, что настройка Bean Провайдера валидации должно быть достаточно для включения внедрения зависимостей в валидаторы.
Я пропустил этап настройки или каким-то образом неправильно использую этот подход? Как я могу решить эту проблему, чтобы обеспечить правильное внедрение 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»