Как отключить фабрику проверки загрузки Spring

В моем загрузочном приложении Spring:

  1. есть сторонний jar, который содержит более старую версию библиотеки javax.validation
  2. существует также библиотека Spring boot default 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() не найден, и это связано с конфликтом между версиями API проверки. Я знаю, что Hibernate-validator нуждается в новой версии validation-api (1.1.0), но Spring каким-то образом подбирает более старую версию классов validation-api, которые присутствуют в сторонней банке.

Я не могу удалить старую версию классов validation-api из моего процесса сборки, так как они встроены в jar сторонних, которые мне нужны для других целей.

Пробовал пару вариантов:

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

а также

spring.jpa.properties.javax.persistence.validation.mode=none в application.properties, но ни один из них не работал.

Есть ли способ при загрузке Spring отключить buildValidatorFactory или LocalValidatorFactoryBean, чтобы избежать этой ошибки?


person user7434698    schedule 12.08.2018    source источник
comment
попробуйте использовать параметр exclude аннотаций Autoconfiguration или SpringBootApplication, например: @EnableAutoConfiguration(exclude=buildValidatorFactory.class) или @SpringBootApplication(exclude = buildValidatorFactory.class) и посмотрите, имеет ли это значение   -  person Maurice    schedule 12.08.2018
comment
@SpringBootApplication(exclude=ConfigurationImpl.class) @SpringBootApplication(exclude=HibernateValidator.class) @SpringBootApplication(exclude=LocalValidatorFactoryBean.class) Пробовал все вышеперечисленные варианты, но никаких изменений в поведении. Пробовал те же классы с @EnableAutoConfiguration, но без изменений.   -  person user7434698    schedule 13.08.2018
comment
Вы можете исключить ненужные версии в файле pom.   -  person Meziane    schedule 14.06.2019


Ответы (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 без гибернации.

person Dmitry Sleptsov    schedule 12.05.2020