亲爱的春天社区,
我要实现的是以下内容:
- 我希望每个控制器都有一个自定义验证器(通过
@InitBinder
) - 我想春天打电话
validator.validate()
(所以不是这样) - 我想为此使用 JSR-303
@Valid
注释 - 要验证的 bean (
RegistrationForm
) 没有任何每个字段的 JSR-303 注释 - 我不想将验证实现(如Hibernate)包含到类路径中;从上面的陈述来看,这将是无用的
我基本上遵循这里提到的步骤:
- 我添加
javax.validation.validation-api:validation-api
为我的依赖项 - 我用
<mvc:annotation-driven />
- 我用以下标记我的模型
@Valid
:public String onRegistrationFormSubmitted(@ModelAttribute("registrationForm") @Valid RegistrationForm registrationForm, BindingResult result) ...
那么会发生什么,验证 API 尝试定位任何实现并失败:
Caused by: javax.validation.ValidationException: Unable to find a default provider
at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:264)
at org.springframework.validation.beanvalidation.LocalValidatorFactoryBean.afterPropertiesSet(LocalValidatorFactoryBean.java:183)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417)
出路是为 定义一个validator
属性AnnotationDrivenBeanDefinitionParser
:
<bean name="validator" class="org.company.module.RegistrationFormValidator" />
<mvc:annotation-driven validator="validator" />
但是这种方法意味着验证器将被设置为所有控制器ConfigurableWebBindingInitializer.initBinder()
。
我知道我正在尝试以一种特殊的方式使用该框架,但是社区会说什么,如果validator
属性有特殊含义告诉验证器不需要被解析,例如
<mvc:annotation-driven validator="manual" />
特殊处理:
--- AnnotationDrivenBeanDefinitionParser.java.orig 2011-06-30 14:33:10.287577300 +0200
+++ AnnotationDrivenBeanDefinitionParser.java 2011-06-30 14:34:27.897449000 +0200
@@ -152,6 +152,10 @@
private RuntimeBeanReference getValidator(Element element, Object source, ParserContext parserContext) {
if (element.hasAttribute("validator")) {
+ if ("manual".equals(element.getAttribute("validator"))) {
+ return null;
+ }
+
return new RuntimeBeanReference(element.getAttribute("validator"));
}
else if (jsr303Present) {
欢迎任何反馈。
PS 来自Spring 论坛的转贴。