覆盖 Spring web mvc 的默认休眠验证器



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

此答案建议使用以下代码避免使用默认工厂:

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,我认为由基于 LocalValidatorFactoryBean 的 javadoc 的验证Validation.buildDefaultValidatorFactory()器填充

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

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

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

我不再需要表达式语言依赖项,我的验证正在使用休眠验证器5.2.5.Final

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

@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;
}

尝试查看配置 Bean 验证提供程序,以讨论验证提供程序机制,例如,弹簧驱动的方法验证,然后将其注入为默认的方法验证 Bean。

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

(我在 Spring 4.x 上做了这种事情,在 WebSphere Application Server 上,在这里。

最新更新