当前位置: 首页 > 知识库问答 >
问题:

如何禁用Spring Boot验证工厂

姬浩渺
2023-03-14
  1. 有一个第三方jar包含旧版本的javax.validation库
  2. 还有随hibernate-validator(5.3.5.final)一起提供的Spring Boot默认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()方法,这是由于验证API版本之间的冲突。我知道Hibernate-validator需要新版本的validation-api(1.1.0),但Spring却在某种程度上采用了第三方JAR中提供的validation-api类的旧版本。

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

我试过几种选择:

而且

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

Spring boot中是否有方法禁用BuildValidatorFactorLocalValidatorFactoryBean来避免此错误?

共有1个答案

祁晟
2023-03-14

在我的案例中,以下解决方案起到了帮助作用:

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
 类似资料:
  • 问题内容: 我已在中注释掉了csrf处理器和中间件产品线 但是,当我使用Ajax发送请求时,Django仍然会响应“ csrf令牌不正确或丢失”,并且在将X-CSRFToken添加到标头后,请求将会成功。 这里发生了什么 ? 问题答案: 如果只需要一些视图而不使用CSRF,则可以使用@csrf_exempt:

  • 在尝试使用JSR-303(hibernate Validator)验证模型时,我在将

  • 问题内容: 从詹金斯(Jenkins)创建工作时,出现以下错误。如何在Jenkins中禁用证书验证? 在Git Bash中,我可以使用命令来禁用它,但不确定如何从Jenkins使用它。 错误: 问题答案: 最好的选择是将自签名证书添加到您的证书存储中 获取服务器证书树这可以使用chrome完成。 导航到服务器地址。单击挂锁图标并查看证书。将所有证书链导出为base64编码文件(PEM)格式。 将证

  • 我们使用的是spring core+struts(没有spring MVC)

  • 问题内容: 正在运行我的表单(例如,跟踪原始,脏污等)。我不需要此功能;我确定这会增加我的费用。 如何关闭它? 问题答案: AFAIK没有简单的开关可以关闭AngularJS验证。实际上,大多数验证都发生在和输入指令中- 基本上是input.js文件中的代码。因此,要摆脱内置验证,您将不得不从该文件中重新开发代码(以及一些其他代码,例如select)。 您是否将验证代码标识为应用程序中的性能瓶颈?

  • 我想你可以想象家务控制器中有什么,但为了完整起见,这里有相关的部分: 下面是测试在输出中打印的请求: 那么,为什么我的测试会得到401的返回代码,我如何修复它?