春季-使用JSR-303和自定义验证

春季-使用JSR-303和自定义验证,第1张

概述尊敬的Spring社区,我正在尝试实现以下内容:>我希望每个控制器都有一个自定义验证器(via @InitBinder)>我想让Spring调用validator.validate()(所以not this way)>我想为此使用JSR-303 @Valid注释>要验证的bean(RegistrationForm)没有任何按字段的JS

尊敬的Spring社区,

我正在尝试实现以下内容:

>我希望每个控制器都有一个自定义验证器(via @InitBinder)
>我想让Spring调用valIDator.valIDate()(所以not this way)
>我想为此使用JsR-303 @ValID注释
>要验证的bean(RegistrationForm)没有任何按字段的JsR-303批注
>我不想在类路径中包含验证实现(例如Hibernate);从上面的声明中将是无用的

我基本上遵循here所述的步骤:

>我将javax.valIDation.valIDation-API:valIDation-API添加为我的依赖项
>我使用< mvc:注释驱动/>
>我用@ValID标记我的模型:
公共字符串onRegistrationFormsubmitted(@modelattribute(“ registrationForm”)@ValID RegistrationForm registrationForm,BindingResult结果)…

因此,发生的情况是验证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)

解决方法是为AnnotationDrivenBeanDeFinitionParser定义一个验证器属性:

<bean name="valIDator"  /><mvc:annotation-driven valIDator="valIDator" />

但是这种方法意味着验证器将通过ConfigurableWebBindingInitializer.initBinder()设置为所有控制器.

我了解我正在尝试以一种特殊的方式使用该框架,但是如果验证器属性有特殊含义(告诉您不需要解析验证器),社区会说些什么.

<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) {

欢迎任何反馈.

附言从Spring Forum转发.最佳答案这也是我在above mentioned forum上的答案/解决方法的转贴.无论如何,我认为在这里也可能有所帮助.

我发现的唯一解决方法是实现自己的@ValID注释,一旦Spring(至少在3.1.1.RELEASE代码库中)仅检查方法参数注释的简单名称(请查看org.springframework.web.method.annotation) .modelattributeMethodProcessor类).这样,我不需要将javax.valIDation.valIDation-API:valIDation-API添加到项目的依赖项中,并且不再获取臭名昭著的javax.valIDation.ValIDationException:无法找到默认提供程序.

/** * ValIDate the model attribute if applicable. * <p>The default implementation checks for {@code @javax.valIDation.ValID}. * @param binder the DataBinder to be used * @param parameter the method parameter */protected voID valIDateIfApplicable(WebDataBinder binder,MethodParameter parameter) {    Annotation[] annotations = parameter.getParameterannotations();    for (Annotation annot : annotations) {        if (annot.annotationType().getSimplename().startsWith("ValID")) {            Object hints = AnnotationUtils.getValue(annot);            binder.valIDate(hints instanceof Object[] ? (Object[]) hints : new Object[] {hints});        }    }}
总结

以上是内存溢出为你收集整理的春季-使用JSR-303和自定义验证 全部内容,希望文章能够帮你解决春季-使用JSR-303和自定义验证 所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1237126.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存