Spring-Boot 如何正确地注入 javax.validation.Validator

2022-08-31 20:35:38

在尝试使用JSR-303(休眠验证器)验证模型时,我在将注入弹簧应用程序bean时遇到问题Validator

我的主要配置类是:

@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();

休眠验证器位于类路径上。我正在尝试将其注入存储库:

@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;


答案 1

您需要声明一个类似如下类型的 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支持,那么Hibernate将尝试自动验证您的Beans以及Spring Framework。这可能会导致这样的问题,因为Hibernate不知道Spring Context,据我所知,没有办法告诉它,即使是LocalValidatorFactoryBean也是如此。这会导致验证程序运行两次。一个正确,一旦失败。javax.validation.ValidationException: HV000064: Unable to instantiate ConstraintValidator

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

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

我更新了这个例子,因为它是我一遍又一遍地发现的关于验证器没有被注入的,事实证明这就是我面临的问题。

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


答案 2

推荐