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?
Похоже, что в 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, но я не вижу никакого чистого способа сделать это.
Существует также возможность передать ValidatorFactory в качестве свойства при создании менеджера сущностей с помощью свойства javax.persistence.validation.factory. Если под этим свойством хранится экземпляр ValidatorFactory, менеджер сущностей использует эту фабрику валидаторов вместо создания новой.