Внедрение зависимости JSR-303 и В спящем режиме

Spring 3.0.2, будьте в спящем режиме 3.5.0, быть-в-спящем-режиме-блок-проверки-допустимости 4.0.2. GA

Я пытаюсь ввести зависимости от Spring в использование ConstraintValidator:

@PersistenceContext
private EntityManager entityManager;

Я настроил контекст приложения с:

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>

Которому, согласно документации Spring, должен позволить “пользовательскому ConstraintValidators извлекать выгоду из внедрения зависимости как любой другой боб Spring”

В отладчике I видят, что Spring называет getBean для создания ConstraintValidator. Позже, когда сброс инициировал предварительную вставку, другой ConstraintValidator создают и называют. Проблемой является EntityManager, является пустым в этом новом ConstraintValidator. Я попытался ввести другие зависимости в ConstraintValidator, и они являются всегда пустыми.

Кто-либо знает, возможно ли ввести зависимости в ConstraintValidator?

9
задан Jam 26 April 2010 в 09:34
поделиться

2 ответа

Похоже, что в JPA2 срабатывает механизм проверки поставщика сохраняемости по умолчанию при предварительном сохранении, предварительном обновлении и т. д.

Он использует свой собственный механизм для создания валидаторов, Spring не участвует.

Единственное решение, которое я вижу на данный момент, - это отключение встроенной проверки JPA2 в файле persistence.xml:

<persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL">
  <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <properties>
      <property name="hibernate.show_sql" value="true"/>
      <!-- other props -->
    </properties>
  <validation-mode>NONE</validation-mode>
</persistence-unit>

Затем используйте Spring LocalValidatiorFactoryBean как обычно. Затем вам придется вызывать валидаторы вручную, как в мире до JPA2.

ОБНОВЛЕНИЕ:

Другим решением было бы указать фабрику-валидатор ограничений в файле META-INF / validation.xml.

Было бы очень хорошо, если бы это мог быть Spring SpringConstraintValidatorFactory , но, к сожалению, он требует, чтобы в его конструктор был передан AutowireCapableBeanFactory , но ожидается класс без конструктора без аргументов. здесь JPA2.

Это оставляет возможность создания собственной реализации ConstraintValidatorFactory , которая извлекает валидаторы из Spring, но я не вижу никакого чистого способа сделать это.

4
ответ дан 4 December 2019 в 08:00
поделиться

Существует также возможность передать ValidatorFactory в качестве свойства при создании менеджера сущностей с помощью свойства javax.persistence.validation.factory. Если под этим свойством хранится экземпляр ValidatorFactory, менеджер сущностей использует эту фабрику валидаторов вместо создания новой.

1
ответ дан 4 December 2019 в 08:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: