spring-boot - 如何禁用 Spring boot 验证工厂

标签 spring-boot hibernate-validator spring-validator

在我的 Spring boot 应用程序中:

  1. 有一个第三方 jar,其中包含旧版本的 javax.validation 库
  2. 还有 Spring boot 默认 javax.validation 库 (1.1.0.Final) 附带 hibernate-validator (5.3.5.Final)

我的代码构建正确。但是,启动过程中失败并出现以下错误:

Caused by: java.lang.NoSuchMethodError: javax.validation.spi.ConfigurationState.getParameterNameProvider()Ljavax/validation/ParameterNameProvider;
    at org.hibernate.validator.internal.engine.ValidatorFactoryImpl.<init>(ValidatorFactoryImpl.java:146)
    at org.hibernate.validator.HibernateValidator.buildValidatorFactory(HibernateValidator.java:38)
    at org.hibernate.validator.internal.engine.ConfigurationImpl.buildValidatorFactory(ConfigurationImpl.java:331)
    at org.springframework.validation.beanvalidation.LocalValidatorFactoryBean.afterPropertiesSet(LocalValidatorFactoryBean.java:305)
    at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor$ValidatedLocalValidatorFactoryBean.<init>(ConfigurationPropertiesBindingPostProcessor.java:412)
    at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.getValidator(ConfigurationPropertiesBindingPostProcessor.java:368)
    at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.determineValidator(ConfigurationPropertiesBindingPostProcessor.java:352)
    at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.postProcessBeforeInitialization(ConfigurationPropertiesBindingPostProcessor.java:314)
    at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.postProcessBeforeInitialization(ConfigurationPropertiesBindingPostProcessor.java:291)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:409)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1620)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
    ... 63 more

从日志中可以清楚地看出,没有找到 ConfigurationState.getParameterNameProvider() 方法,这是由于validation-api版本之间的冲突造成的。我知道 Hibernate-validator 需要新版本的validation-api(1.1.0),但Spring以某种方式选择了第三方jar中存在的旧版本的validation-api类。

我无法从构建过程中删除旧版本的validation-api类,因为它们内置了我用于其他目的所需的第三方 jar。

我尝试了几个选项:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration

application.properties 中的

spring.jpa.properties.javax.persistence.validation.mode=none 但它们都不起作用。

在 Spring boot 中是否有办法禁用 buildValidatorFactoryLocalValidatorFactoryBean 来避免此错误?

最佳答案

就我而言,以下解决方案有所帮助:

ValidatorFactoryBeanWithDisabledValidation.java

@Component
@Primary
@ConditionalOnProperty(prefix = "spring.custom.beans", name = "validator-factory-with-disabled-validation")
public class ValidatorFactoryBeanWithDisabledValidation extends OptionalValidatorFactoryBean {
    @Override
    public <T> Set<ConstraintViolation<T>> validate(final T object, final Class<?>... groups) {
        return Set.of();
    }

    @Override
    public <T> Set<ConstraintViolation<T>> validateProperty(final T object,
                                                            final String propertyName,
                                                            final Class<?>... groups) {
        return Set.of();
    }

    @Override
    public <T> Set<ConstraintViolation<T>> validateValue(final Class<T> beanType,
                                                         final String propertyName,
                                                         final Object value,
                                                         final Class<?>... groups) {
        return Set.of();
    }

    @Override
    public void validate(final Object target, final Errors errors) {
    }

    @Override
    public void validate(final Object target, final Errors errors, final Object... validationHints) {
    }

    @Override
    public void validateValue(final Class<?> targetType,
                              final String fieldName,
                              final Object value,
                              final Errors errors,
                              final Object... validationHints) {
    }
}

application.properties

spring.custom.beans.validator-factory-with-disabled-validation=true
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration

我使用 spring-boot 2.1.2.RELEASE 版本,没有休眠。

关于spring-boot - 如何禁用 Spring boot 验证工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51811299/

相关文章:

java - 使用 Angular 参数上传文件

java - Spring Boot多模块Maven项目@Autowired不工作

java - 在服务层中使用 Spring 进行 Bean 验证

spring - 验证 Spring RestController 中的 HTTP header 字段

java - 如何验证 List 类型的@RequestParam 的大小

java - 将 Kafka Streams 用作 Kafka Consumer 应用程序中的状态存储

java - 组合规范并防止 NullPointerException 和 IllegalArgumentException

java - 如何让 Spring 为类上的同一个 validator 显示不同的基于验证包的消息?

java - 有条件的 hibernate 验证?

java - 在 Spring MVC 中使用 JSR-303 注释进行条件验证