【问题标题】:jsr-303 validation in spring mvc application doesn't validatespring mvc 应用程序中的 jsr-303 验证未验证
【发布时间】:2012-03-07 10:00:40
【问题描述】:

我在春季为表单设置验证时遇到了一些问题。

我要验证的 bean 如下所示:

public class RegistrationForm extends ProjectXUser {
@NotEmpty
private String password2;

@NotBlank
@AssertTrue
private Boolean agreedToConditions;
...

ProjectXUser 继承自 BaseUser,BaseUser 具有更多的属性,这些属性也被注释了。

我的控制器如下所示:

@Controller
public class RegistrationController {
private static final String REGISTRATION_JSP = "registration";

 @ModelAttribute("registrationForm")
 public RegistrationForm getRegistrationForm() {
    return new RegistrationForm();
 }

 @RequestMapping(value = { "/registratie/jaar", "registratie/proef" }, method = RequestMethod.GET)
 public String year() {
  return "registration";
 }

 @RequestMapping(value = { "/registratie/jaar", "registratie/proef" }, method = RequestMethod.POST)
 public ModelAndView register(@Valid RegistrationForm registrationForm, BindingResult result) {
  if (result.hasErrors()) {
     return new ModelAndView(REGISTRATION_JSP);
  } else {
     return new ModelAndView("redirect:/registratie/success");
  }
 }
}

我的spring配置文件包含:

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
<mvc:annotation-driven />

我在 spring 文档中读到,如果类路径中存在 jsr-303 验证器,spring 将自动检测并使用它。所以我在我的 pom.xml 中添加了休眠验证器。

但是当我调试我的控制器时,我可以看到registrationForm包含我填写的值。但结果总是有0个错误。即使我在表单字段中输入了一些明确的错误输入。

【问题讨论】:

  • 我猜你使用 来让你的 @Controller 工作,但是你的 RegistrationForm 类在扫描的包中吗?
  • 是的,我正在使用 。它正在扫描 org.x.y,而我的 RegistrationForm 位于 org.x.y.web.forms。所以它应该把它捡起来。
  • 如果您使用validator.validate(registrationForm) 手动验证,是否有效?
  • 等等,您的表单“包含我填写的值”,但它没有错误?看起来您只是在验证字段是否具有值。
  • 问题解决了吗?我有同样的问题,除了在我的情况下,当验证失败并且代码永远不会进入“if (result.hasErrors())”行时,它会返回“错误 400”。当必填字段不为空时,代码可以正常工作。

标签: spring hibernate spring-mvc bean-validation


【解决方案1】:

有错误的情况下需要在ModelAndView中返回结果。你返回的只是一个空的mav。

例如,请参阅:http://forum.springsource.org/showthread.php?117436-Spring-MVC-3-and-returning-validation-errors-to-page-from-Valid&highlight=bindingresult

【讨论】:

    【解决方案2】:

    如果您的这段代码被触发并重定向回您的注册页面

    if (result.hasErrors()) {
        return new ModelAndView(REGISTRATION_JSP);
    }
    

    然后您的 JSR-303 验证将被提取。你需要像这样在你的 JSP 页面上显示你的错误

    <form:errors path="password2" cssClass="error" />
    

    cssClass="error" 是您要用来显示错误的 CSS。它会自动为您放入&lt;div&gt;

    【讨论】:

      猜你喜欢
      • 2011-05-10
      • 2018-08-15
      • 2011-07-24
      • 2013-11-23
      • 2013-12-27
      • 2011-04-30
      • 2014-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多