Spring boot 如何禁用Spring启动验证工厂

Spring boot 如何禁用Spring启动验证工厂,spring-boot,hibernate-validator,spring-validator,Spring Boot,Hibernate Validator,Spring Validator,在我的Spring启动应用程序中: 有一个第三方jar,其中包含较旧版本的javax.validation库 hibernate validator(5.3.5.Final)附带了Spring bootdefaultjavax.validation库(1.1.0.Final) 我的代码正确构建。但是,在启动过程中失败,出现以下错误: Caused by: java.lang.NoSuchMethodError: javax.validation.spi.ConfigurationState.ge

在我的Spring启动应用程序中:

  • 有一个第三方jar,其中包含较旧版本的javax.validation库
  • hibernate validator(5.3.5.Final)附带了Spring bootdefaultjavax.validation库(1.1.0.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
    
    原因:java.lang.NoSuchMethodError:javax.validation.spi.ConfigurationState.getParameterNameProvider()Ljavax/validation/ParameterNameProvider;
    位于org.hibernate.validator.internal.engine.validatoryImpl.(validatoryImpl.java:146)
    位于org.hibernate.validator.HibernateValidator.buildValidatorFactory(HibernateValidator.java:38)
    位于org.hibernate.validator.internal.engine.configurationmpl.buildValidatorFactory(configurationmpl.java:331)
    位于org.springframework.validation.beanvalidation.LocalValidatoryFactoryBean.AfterPropertieSet(LocalValidatoryFactoryBean.java:305)
    位于org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor$ValidatedLocalValidatorFactoryBean。(ConfigurationPropertiesBindingPostProcessor.java:412)
    位于org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.getValidator(ConfigurationPropertiesBindingPostProcessor.java:368)
    位于org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.determineValidator(ConfigurationPropertiesBindingPostProcessor.java:352)
    位于org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.postProcessBeforeInitialization(ConfigurationPropertiesBindingPostProcessor.java:314)
    位于org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.postProcessBeforeInitialization(ConfigurationPropertiesBindingPostProcessor.java:291)
    在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:409)上
    位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1620)
    位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
    ... 63多
    
    从日志中可以清楚地看到,未找到
    ConfigurationState.getParameterNameProvider()
    方法,这是由于验证api版本之间存在冲突。我知道Hibernate validator需要新版本的验证api(1.1.0),但Spring不知何故选择了第三方jar中存在的旧版本的验证api类

    我无法从我的构建过程中删除旧版本的验证api类,因为它们是与我需要用于其他目的的第三方jar内置的

    我尝试了两种选择:

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

    application.properties
    中的
    spring.jpa.properties.javax.persistence.validation.mode=none
    ,但它们都不起作用


    在Spring boot中有没有办法禁用
    buildValidatorFactory
    LocalValidatorFactoryBean
    以避免此错误?

    在我的例子中,以下解决方案有帮助:

    ValidatorFactoryBeanWithDisabledValidation.java


    我使用没有hibernate的spring boot 2.1.2.RELEASE版本。

    尝试使用自动配置的排除参数或SpringBootApplication注释,如:
    @EnableAutoConfiguration(exclude=buildValidatorFactory.class)
    @SpringBootApplication(exclude=buildValidatorFactory.class)
    并查看这是否有区别
    @SpringBootApplication(exclude=ConfigurationImpl.class)@SpringBootApplication(exclude=HibernateValidator.class)@SpringBootApplication(exclude=LocalValidatoryFactoryBean.class)
    尝试了上述所有选项,但没有改变行为。使用
    @EnableAutoConfiguration
    也尝试了相同的类,但没有更改。您可以在
    pom
    中排除不需要的版本。
    @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) {
        }
    }
    
    spring.custom.beans.validator-factory-with-disabled-validation=true
    spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration