如何禁用Spring Boot验证工厂

时间:2018-08-12 17:38:46

标签: spring-boot hibernate-validator spring-validator

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

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

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

Color

从日志中可以清楚地发现未找到GetRed()方法,这是由于validate-api版本之间的冲突引起的。我知道Hibernate-validator需要新版本的Validation-api(1.1.0),但Spring会以某种方式获取第三方jar中存在的旧版本的Validation-api类。

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

我尝试了几种选择:

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()spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration中,但没有一个起作用。

Spring引导中是否有一种方法可以禁用spring.jpa.properties.javax.persistence.validation.mode=noneapplication.properties来避免此错误?

1 个答案:

答案 0 :(得分:1)

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

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

i使用spring-boot 2.1.2.RELEASE版本而不休眠。