2013-03-11 18 views
5

登录形式提交与无效数据形式发送的语法不正确的请求:当在春季MVC(其使用Hibernate验证)

<f:form class="form-horizontal" method="post" action="/login" 
    commandName="logindata"> 
    <fieldset> 
     <legend class="text-info">Login</legend> 
     <div class="control-group"> 
      <f:label path="uname" class="control-label" for="uname">Username</f:label> 
      <div class="controls"> 
       <f:input type="text" path="uname" name="uname" id="uname" 
        placeholder="Username" /> 
      </div> 
     </div> 
     <div class="control-group"> 
      <f:label path="pwd" class="control-label" for="pwd">Password</f:label> 
      <div class="controls"> 
       <f:input type="password" path="pwd" name="pwd" id="pwd" 
        placeholder="Password" /> 
      </div> 
     </div> 
     <div class="control-group"> 
      <div class="controls"> 
       <button type="submit" class="btn" id="login"> 
        Login <i class="icon-chevron-right"></i> 
       </button> 
      </div> 
     </div> 
     <div id="errormsg" class="alert alert-error">${message}</div> 
    </fieldset> 
</f:form> 

的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); 
       } 
      } 
    } 


登录工作正常。然而,当它是无效的,例如,当密码字段为空或用户名是长小于4个字符,显示以下错误:

The request sent by the client was syntactically incorrect. 

任何想法如何这可能是固定的吗?

回答

37

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

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

这是在这个星期甚至提到This Week in Spring - March 5th, 2013博客条目

有人问我这个有一天,我觉得这是值得一提 的:在你的Spring MVC @Controller类处理程序方法,使 确定BindingResult参数紧跟在模型或 命令参数之后,如下所示:@RequestMapping(...)public String handleRequest(@ModelAttribute @Valid YourCustomPojo尝试, BindingResult结果)。在这个例子中,将的handleRequest验证 的POJO(YourCustomPojo) - 检查POJO的JSR303的注解 和尝试,因为POJO的注解 与@Valid应用的限制 - 在BindingResult和藏匿的任何错误,它 品牌如果我们要求它可用。

Spring将

  • 0)determin的处理程序方法
  • 1)创建loginData
  • 的实例
  • 2)填充它
  • 3)验证它,并存储验证结果在BindingResult中
  • 4)调用方法(使用loginData和BindingResult值),无论绑定结果是否包含错误
+1

因此,无论你用不用@Valid BindingResult(当它是不是有效的方法得到不调用),你你有一个BindingResult DIRECT这个参数则报复错误 – Ralph 2013-03-11 18:08:34

+0

这...帮助调用以后。 。很多...谢谢! – Jagger 2015-02-09 21:17:55