Reputation: 283
In my Spring boot application:
My code builds properly. However, fails during startup with following error:
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
It is clear from log that ConfigurationState.getParameterNameProvider()
method is not found, and that is due to clash between validation-api versions. I know Hibernate-validator needs new version of validation-api (1.1.0) but Spring is somehow picking up older version of validation-api classes which is present in third party jar.
I can't remove old version of validation-api classes from my build process, as they come inbuilt with third party jar that I need for other purpose.
I tried couple of options:
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration
and
spring.jpa.properties.javax.persistence.validation.mode=none
in application.properties
but none of them worked.
Is there a way in Spring boot to disable buildValidatorFactory
or LocalValidatorFactoryBean
to avoid this error?
Upvotes: 2
Views: 5423
Reputation: 71
In my case the following solution helped:
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 using spring-boot 2.1.2.RELEASE version without hibernate.
Upvotes: 3