覆盖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的主要内容,如果未能解决你的问题,请参考以下文章