在Spring MVC中使用无效数据提交表单时发送的语法错误请求(使用hibernate Validator)

登录表格:

 
Login
Username
Password
${message}

loginData类:

 package com.demo.forms; import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.NotEmpty; public class loginData { @Length(min=4) private String uname; @NotEmpty private String pwd; public String getUname() { return uname; } public void setUname(String uname) { this.uname = uname; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } } 

显示和提交表单的控制器方法:(显示包含注册表单和登录表单的主页)

 @RequestMapping(value = "/", method=RequestMethod.GET) public String showHome(Model model) { loginservice.logout(); model.addAttribute("logindata", new loginData()); model.addAttribute("signupdata", new signupData()); return "home"; } 

要求提交登录表单的方法:

 @RequestMapping(value = "login", method=RequestMethod.POST) public String submitloginForm(@Valid loginData logindata, SessionStatus state, Model model, BindingResult result) { if((loginservice.loggedin()) || (result.hasErrors())) { return showHome(model); } else { String uname = logindata.getUname(); String pwd = logindata.getPwd(); if(loginservice.login(uname, pwd)) { model.addAttribute("user",uname); return "redirect:profile"; } else { model.addAttribute("message","Invalid Username/Password"); return showHome(model); } } } 

输入的数据为“有效”(正确或错误)时,登录正常。 但是,当它无效时,例如,当密码字段为空或用户名长度少于四个字符时,将显示以下错误:

 The request sent by the client was syntactically incorrect. 

知道如何解决这个问题吗?

您必须修改参数的顺序。 将BindingResult result参数始终直接放在带有@Valid注释的参数之后。

 @RequestMapping(value = "login", method=RequestMethod.POST) public String submitloginForm(@Valid loginData logindata, BindingResult result, SessionStatus state, Model model) 

本周春季 – 2013年3月5日博客文章本周甚至提到了这一点

前几天有人问过我,我觉得值得一提:在你的Spring MVC @Controller类处理程序方法中,确保BindingResult参数紧跟在模型或命令参数之后,如下所示:@RequestMapping(。 ..)public String handleRequest(@ModelAttribute @Valid YourCustomPojo尝试,BindingResult结果)。 在此示例中,handleRequest将validationPOJO(YourCustomPojo) – 检查POJO以获取JSR303注释并尝试应用约束,因为POJO使用@Valid注释 – 并存储BindingResult中的任何错误,如果我们要求它可用为了它。

spring会

  • 0)确定处理程序方法
  • 1)创建loginData的实例
  • 2)填充它
  • 3)validation它,并将validation结果存储在BindingResult中
  • 4)调用方法(使用loginData和BindingResult值),无论何时绑定Result包含错误