gpt4 book ai didi

java - Spring-Boot 如何正确注入(inject) javax.validation.Validator

转载 作者:IT老高 更新时间:2023-10-28 13:04:30 34 4
gpt4 key购买 nike

我在尝试使用 JSR-303 (hibernate-validator) 验证模型时将 Validator 注入(inject) 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 在类路径中。我正在尝试将其注入(inject)存储库:

@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; 注释并使用验证逻辑的测试)失败。

最佳答案

您需要像这样声明一个 LocalValidatorFactoryBean 类型的 bean:

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

在 XML 或

@Bean
public javax.validation.Validator localValidatorFactoryBean() {
return new LocalValidatorFactoryBean();
}

在 Java 配置中。

编辑:

重要的是要了解,如果 JPA 正在使用并且由 Hibernate 支持,那么 Hibernate 将尝试自动验证您的 Bean 以及 Spring 框架。这可能导致 javax.validation.ValidationException: HV000064: Unable to instantiate ConstraintValidator 的问题,因为 Hibernate 不知道 Spring Context 并且据我所知没有办法告诉它,甚至没有使用 LocalValidatorFactoryBean。这会导致 validator 运行两次。一个正确,一旦失败。

为了禁用默认的 Hibernate ORM 验证,需要为 Spring 设置以下属性:

spring.jpa.properties.javax.persistence.validation.mode=none

我更新了这个例子,因为我一遍又一遍地发现 validator 没有被注入(inject),结果证明这是我面临的问题。

This Spring 文档的一部分包含所有详细信息

关于java - Spring-Boot 如何正确注入(inject) javax.validation.Validator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23604540/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com