Validator
尝试使用JSR-303(hibernate-validator)验证模型时,将注入spring应用程序bean时遇到问题
我的主要配置类是:
@EnableAutoConfiguration
@EnableWebMvc // <---
@EnableJpaRepositories("com.example")
@EntityScan("com.example")
public class MainConfiguration {
根据javadocs:
/**
* Provide a custom {@link Validator} instead of the one created by default.
* The default implementation, assuming JSR-303 is on the classpath, is:
* {@link org.springframework.validation.beanvalidation.LocalValidatorFactoryBean}.
* Leave the return value as {@code null} to keep the default.
*/
Validator getValidator();
Hibernate-validator在类路径上。我正在尝试将其注入存储库中:
@Repository
public class UserRepositoryImpl implements UserRepositoryCustom {
@Autowired
private Validator validator;
抛出异常:
No qualifying bean of type [javax.validation.Validator] found for dependency:
更新:
此问题的部分解决方法是在主配置类中对此进行定义:
@Bean
public Validator validator() {
return new org.springframework.validation.beanvalidation.LocalValidatorFactoryBean();
}
但是集成测试(需要org.springframework.test.context.web.WebAppConfiguration;
注释并使用验证逻辑的集成测试)失败。
您需要声明一个如下类型的bean LocalValidatorFactoryBean
:
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
以XML或
@Bean
public javax.validation.Validator localValidatorFactoryBean() {
return new LocalValidatorFactoryBean();
}
在Java Config中。
编辑:
重要的是要了解,如果正在使用JPA并由Hibernate支持JPA,则Hibernate将尝试自动验证Bean和Spring框架。这可能会导致出现问题,javax.validation.ValidationException: HV000064: Unable to instantiate ConstraintValidator
因为Hibernate不了解Spring Context,据我所知,甚至使用LocalValidatorFactoryBean,也无法做到这一点。这将导致验证程序运行两次。一个正确,一旦失败。
为了禁用默认的Hibernate ORM验证,需要为Spring设置以下属性:
spring.jpa.properties.javax.persistence.validation.mode=none
我更新了这个示例,因为这是我一遍又一遍地发现未注入Validator的示例,事实证明这是我面临的问题。
Spring文档的这一部分包含所有详细信息
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句