自定义存储库在自定义约束验证器中为空
我有一个基于Spring的webapp。 我在控制器中使用了多个存储库类,注释@Repository,@Transactional。 这部分工作正常。
我创建了一个必须访问存储库的自定义约束验证器。 现在我无法理解为什么存储库是空的。 我试着用@Component注释来注释验证器。 包含所有这些类的基本包位于xml的一部分中。 那么我还应该做些什么来确保存储库依赖注入的工作。 这是我的约束验证器的外观。
public class DonorTypeExistsConstraintValidator implements
ConstraintValidator<DonorTypeExists, DonorType> {
@Autowired
private DonorTypeRepository donorTypeRepository;
@Override
public void initialize(DonorTypeExists constraint) {
}
public boolean isValid(DonorType target, ConstraintValidatorContext context) {
System.out.println("donorType: " + target);
if (target == null)
return true;
try {
if (donorTypeRepository.isDonorTypeValid(target.getDonorType()))
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
public void setDonorRepository(DonorTypeRepository donorTypeRepository) {
this.donorTypeRepository = donorTypeRepository;
}
}
更新
包扫描配置:
<context:annotation-config />
<!-- Configures the @Controller programming model -->
<mvc:annotation-driven />
<context:component-scan base-package="controller" />
<context:component-scan base-package="repository" />
<context:component-scan base-package="model" />
<context:component-scan base-package="viewmodel" />
该类位于包model.donortype中。 该存储库位于软件包存储库中。
更新
更令人费解的是,删除所有preinsert侦听器(在本例中只有BeanValidationEventListener)修复了自动装配问题。 这使事情更加复杂。
我甚至没有插入BeanValidationEventListener,如下面的答案中所述。 这实际上与这里的建议相反:JSR-303依赖注入和Hibernate
@Override
public void integrate(Configuration configuration, SessionFactoryImplementor implementor,
SessionFactoryServiceRegistry registry) {
logger.info("Registering event listeners");
System.out.println("here");
// you can add duplication strategory for duplicate registrations
final EventListenerRegistry eventRegistry = registry.getService(EventListenerRegistry.class);
// prepend to register before or append to register after
// this example will register a persist event listener
eventRegistry.prependListeners(EventType.PERSIST, EntitySaveListener.class);
eventRegistry.appendListeners(EventType.MERGE, EntitySaveListener.class);
Iterator<PreInsertEventListener> iter = eventRegistry.getEventListenerGroup(EventType.PRE_INSERT).listeners().iterator();
while (iter.hasNext()) {
PreInsertEventListener el = iter.next();
System.out.println(el.getClass());
BeanValidationEventListener listener = (BeanValidationEventListener) el;
System.out.println(listener);
iter.remove();
}
}
更新
我正在使用JPA。 我有JPA实体的支持表格。 在控制器中,我使用InitBinder实例化一个自定义验证器binder.setValidator(new EntityBackingFormValidator(binder.getValidator()));
。 以下是此代码:https://github.com/C4G/V2V/blob/87dc266043f6d623c101d947a88fa0b0ad536355/src/controller/CollectedSampleController.java
此自定义验证程序会在默认验证程序上调用验证,并让作用域执行一些自定义验证。 https://github.com/C4G/V2V/blob/87dc266043f6d623c101d947a88fa0b0ad536355/src/model/collectedsample/CollectedSampleBackingFormValidator.java
我在实体中使用注释来创建约束。 除了默认约束之外,我需要定义约束来检查多对一映射另一端的实体是否存在。 这是自定义约束验证器。 https://github.com/C4G/V2V/blob/87dc266043f6d623c101d947a88fa0b0ad536355/src/model/donor/DonorExistsConstraintValidator.java
现在,此自定义约束验证程序中的自动装载存储库为空。 我想在我的CustomIntegrator中自定义代码,这里是https://github.com/C4G/V2V/blob/87dc266043f6d623c101d947a88fa0b0ad536355/src/interceptor/CustomIntegrator.java
和xml配置文件在这里https://github.com/C4G/V2V/blob/87dc266043f6d623c101d947a88fa0b0ad536355/war/WEB-INF/v2v-servlet.xml
希望实际的代码将帮助你回答我的问题。 谢谢!
您正在使用哪个ValidatorFactory。 或者换一种说法,对你的bootstrap Bean Validation感兴趣? 默认的Bean验证(以及Hibernate Validator作为参考实现)不会将依赖关系注入到ConstraintValidator实例中。 至少在Bean Validation 1.0中。
要启用依赖注入,你必须配置一个自定义ConstraintValidatorFactory。 Spring提供了SpringConstraintValidatorFactory,它是使用LocalValidatorFactoryBean时的默认值 - 请参阅http://static.springsource.org/spring/docs/3.0.0.RC3/reference/html/ch05s07.html
另外,你在使用JPA吗? 我认为是这样,在这种情况下自动对生命周期事件进行自动验证。 您可以使用属性javax.persistence.validation.mode并将其设置为NONE,而不是尝试删除事件侦听器。 我想知道是否在基于生命周期的验证中使用了正确的验证器。
这一切都取决于你的整体Spring配置和使用。
您是否通过验证工厂以供JPA在执行验证时使用:
<bean
id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="jpaPropertyMap">
<map>
<entry
key="javax.persistence.validation.factory"
value-ref="validator"/>
<!-- ... -->
</map>
</property>
<!-- ... -->
</bean>
这是必需的,否则JPA将使用默认工厂(如validation.xml中所指定)。
DonorTypeExistsConstraintValidator上是否有@Component注释?
那在过去杀了我。
链接地址: http://www.djcxy.com/p/82019.html上一篇: Autowired Repository is Null in Custom Constraint Validator