当前位置: 首页 > 知识库问答 >
问题:

SpringBoot如何正确注入javax。验证。验证器

哈骞仕
2023-03-14

在尝试使用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验证程序位于类路径上。我正在尝试将其注入存储库:

@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个答案

史意致
2023-03-14

您需要声明类型为localvalidatoryFactoryBean的bean,如下所示:

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

以XML或

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

在Java配置中。

编辑:

重要的是要理解,如果正在使用JPA并且由Hibernate支持,那么Hibernate将尝试自动验证您的Beans和Spring框架。这可能会导致javax.validation.ValidationExcture: HV000064:无法实例化ConstraintValidator的问题,因为Hibernate不知道Spring Context,据我所知,没有办法告诉它,即使使用LocalValidatorFactoryBean也是如此。这将导致验证器运行两次。一个正确,一旦失败。

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

代码spring.jpa.properties.javax.persistence.validation.mode

我更新了这个例子,因为我一次又一次地发现验证器没有被注射,结果这就是我面临的问题。

Spring留档的这一部分有所有的细节

 类似资料:
  • 我想验证属性firstName和lastName。但我不想每次都重复注释。 如何创建自定义注释,使代码如下所示 验证也是一样的

  • 我有一个使用javax注释的jax-rs项目(

  • 我的springboot版本是2.3.7。我知道spring boot starter验证不是spring boot starter web的可传递依赖项。但即使单独添加了它,我的注释也不起作用。 //下面的依赖我已经添加build.gradle编译'org.springframework.boot: spring-boot-starter-validation' //我希望在请求时出错的示例类

  • 假设我有以下课程: 是否可以通过“MyProduct”类验证“code”属性?比如:

  • 我对Spring靴有疑问。如何对Spring转换器进行验证?我试图从javax使用ConstraintValidator,但它在转换器之后运行。

  • (仅在测试中使用)我有依赖项(没有spring或DI容器) 我可以通过 myDto在哪里 哪里 哪里 在这个验证器中,所有的工作都很完美,但没有任何注释或在现场发挥作用,他们只是被忽略了 请帮忙。断然的 很抱歉,我的真实案例是相互嵌套的DTO,所以只有高级类经过验证,但没有嵌套。 而另一个有注释的字段未经验证。当我在字段中添加时,它开始正常工作