gpt4 book ai didi

spring - 使用带有自定义验证的 JSR-303

转载 作者:行者123 更新时间:2023-12-01 14:35:37 34 4
gpt4 key购买 nike

亲爱的 Spring 社区,

我要实现的是以下内容:

  • 我希望每个 Controller 有一个自定义验证器 (via @InitBinder )
  • 我希望 Spring 调用 validator.validate()(所以 not this way)
  • 我想为此使用 JSR-303 @Valid 注释
  • 要验证的 bean ( RegistrationForm ) 没有任何每个字段的 JSR-303 注释
  • 我不想将验证实现(如 Hibernate )包含到类路径中;从上面的声明来看,这将是无用的

我基本上按照 here 提到的步骤进行:

  • 我添加 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() 设置到所有 Controller 。

我知道我正在尝试以一种特殊的方式使用该框架,但是社区会怎么说,如果 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) {

欢迎任何反馈。

附言从 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: Unable to find默认提供程序

/**
* 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});
}
}
}

关于spring - 使用带有自定义验证的 JSR-303,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10272000/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com