如何禁用Spring引导验证工厂

问题描述 投票:1回答:1

在我的Spring引导程序中

  1. 有一个 第三者 包含旧版javax.validation库的jar。
  2. 还有春风得意 默认 hibernate-validator(5.3.5.Final)附带的javax.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

从日志中可以看出 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

spring.jpa.properties.javax.persistence.validation.mode=noneapplication.properties 但都没有用。

在Spring引导中,有没有办法禁用这些功能?buildValidatorFactoryLocalValidatorFactoryBean 如何避免这个错误?

spring-boot hibernate-validator spring-validator
1个回答
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) {
    }
}

应用程序.属性

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

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

© www.soinside.com 2019 - 2024. All rights reserved.