覆盖spring web mvc的默认Hibernate Validator

Posted

技术标签:

【中文标题】覆盖spring web mvc的默认Hibernate Validator【英文标题】:Override spring web mvc's default Hibernate Validator 【发布时间】:2021-12-01 23:06:10 【问题描述】:

Spring 使用的是休眠工厂提供的默认验证器工厂。但是,我不想包含表达式语言依赖项。

answer 建议通过使用此代码避免使用默认工厂:

import javax.validation.Validation;
import javax.validation.Validator;
import org.hibernate.validator.messageinterpolation.ParameterMessageInterpolator;

private static final Validator VALIDATOR =
  Validation.byDefaultProvider()
    .configure()
    .messageInterpolator(new ParameterMessageInterpolator())
    .buildValidatorFactory()
    .getValidator();

当我引用 VALIDATOR 时效果很好,但我不确定如何告诉 spring 使用上面的而不是 OptionalValidatorFactoryBean,它扩展了 LocalValidatorFactoryBean,我认为它填充了来自 @ 的验证器987654326@ 基于来自LocalValidatorFactoryBean 的javadoc

综上所述,如何将spring的默认Validation.buildDefaultValidatorFactory()替换为Validation.byDefaultProvider().configure().messageInterpolator(new ParameterMessageInterpolator()).buildValidatorFactory().getValidator() 这样我就可以避免对表达式语言的依赖。

【问题讨论】:

你想像控制器方法和/或命令 bean 一样进行验证吗? 我正在验证由 spring 转换为 bean 的 http 请求。 bean 具有 Bean Validation。 【参考方案1】:

尝试查看 Configuring a Bean Validation Provider 以了解有关 Validation Provider 机制的一些讨论,例如,Spring-driven Method Validation,然后将其作为默认方法验证 bean 注入。

    <bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor">  
        <property name="validatorFactory" ref="myValidatorFactory"/>  
    </bean>

(我在 WebSphere Application Server 上使用 Spring 4.x 做了这种事情,here。)

【讨论】:

谢谢。我会看看这个,明天试试。我会在这里报告结果。【参考方案2】:

感谢@dbreaux 的回答,我浏览了文档并提出了这个解决方案:

@Bean
public LocalValidatorFactoryBean validator() 
    LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean();
    localValidatorFactoryBean.setMessageInterpolator(new ParameterMessageInterpolator());
    return localValidatorFactoryBean;

我不再需要表达式语言依赖项,并且我的验证正在使用 Hibernate Validator 5.2.5.Final

但是,由于安全问题,我不得不升级到6.0.22.Final 并切换到与@dbreaux 非常接近的下面。我还必须将@Validated 添加到@Controller。

@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() 
    MethodValidationPostProcessor bean = new MethodValidationPostProcessor();
    bean.setValidator(Validation.byDefaultProvider()
            .configure()
            // We must use ParameterMessageInterpolator so that we do not need to add a dependency
            // on Java Expression Language which is a potential security vulnerability.
            // See https://securitylab.github.com/research/bean-validation-RCE/ for more info.
            .messageInterpolator(new ParameterMessageInterpolator())
            .buildValidatorFactory()
            .getValidator());
    return bean;

【讨论】:

以上是关于覆盖spring web mvc的默认Hibernate Validator的主要内容,如果未能解决你的问题,请参考以下文章

spring-mvc 应用程序的默认页面是啥

Spring MVC的常用注解

Spring Web MVC (Spring MVC) 的相关例题及解析

通过 Spring MVC 中的配置验证格式参数

spring mvc 访问不到 js css

spring web mvc架构