在Spring MVC中使用无效数据提交表单时发送的语法错误请求(使用hibernate Validator)
登录表格:
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包含错误
- Hibernate Validator – @Length – 如何为min和max指定单独的消息?
- Beanvalidation组序列不起作用
- hibernatevalidation器的注释,用于将来至少24小时的日期
- 如何使用Spring MVC JSR-303 Validator将不同的模型类validation为一个表单
- Hibernatevalidation器在正则表达式匹配上吃CPU
- 由于Bean Validation API而无法启动Hibernate Validator
- 是否有使用带注释的方法参数启用JSR 303 Bean Validation的标准方法
- JSR303 – 应用按顺序定义的所有validation组
- Spring MVC + Hibernate:数据validation策略