2014-01-21 102 views
0

我想在Spring中使用驗證組,但它似乎並不想工作。春季組驗證

當使用@Valid用戶成員時,它工作正常。當我使用@Validated(FormValidationGroup.class)時,它沒有。這是方法簽名。

代碼:

@RequestMapping(value = "/register", method = RequestMethod.POST) 
    public String doRegister(Model model, @Valid User member, BindingResult result) { 

     logger.info("Showing Registration Page...."); 

     if (result.hasErrors()) { 
      return "createmembers"; 
     } 

     if (userService.exists(member.getUsername())) { 
      result.rejectValue("username", "Duplicate Key", 
        "This email address has already been used"); 
      return "createmembers"; 
     } 

     else { 
      userService.create(member); 
      return "registerSuccess"; 
     } 
    } 

其他方法

代碼:

@RequestMapping("/createmembers") 
    public String createMembers(Model model) { 
     logger.info("Showing Create Members Page...."); 
     model.addAttribute("member", new User()); 
     return "createmembers"; 
    } 

我突出的部分是所有的變化。

從跟蹤相關誤差似乎是

java.lang.IllegalStateException:既不BindingResult也不對bean名稱「部件」可作爲請求屬性純目標對象

JSP頁面被如下

代碼:

<sf:form id="details" method="post" action="${pageContext.request.contextPath}/register" commandName="member"> 
<table class="formtable"> 
<tr><td>Name</td><td><sf:input name = "name" path="name" type="text"/><br/><sf:errors path="name" cssClass="error"></sf:errors></td></tr> 
<tr><td>Password</td><td><sf:input id="password" name = "password" path="password" type="password"/><br/><sf:errors path="password" cssClass="error"></sf:errors></td></tr> 
<tr><td>Confirm Password</td><td><input id = "con_password" name = "con_password" type="password"/><div id="matchpass"></div></td></tr> 
<tr><td>Email</td><td><sf:input name = "username" path="username" type="text"/><br/><sf:errors path="username" cssClass="error"></sf:errors></td></tr> 
<tr><td>Gender</td><td><sf:select name="gender" path="gender" class="select"><option value = "M">Male</option><option value = "F">Female</option></sf:select></td></tr> 
<tr><td>Membership Type</td><td><sf:select name="member_type" path="member_type"><option value = "Senior">Senior</option><option value = "Junior">Junior</option><option value = "Student">Student</option></sf:select></td></tr> 
<tr><td>Grade</td><td><sf:select name="grade" path="grade"><option value = "Graded">Graded</option><option value = "Intermediate">Intermediate</option><option value = "Beginner">Beginner</option></sf:select></td></tr> 
<tr><td>Address Line 1</td><td><sf:input name = "ad_line1" path="ad_line1" type="text"/><br/><sf:errors path="ad_line1" cssClass="error"></sf:errors></td></tr> 
<tr><td>Address Line 2</td><td><sf:input name = "ad_line2" path="ad_line2" type="text"/><br/><sf:errors path="ad_line2" cssClass="error"></sf:errors></td></tr> 
<tr><td>City/Town</td><td><sf:input name = "ad_city" path="ad_city" type="text"/><br/><sf:errors path="ad_city" cssClass="error"></sf:errors></td></tr> 
<tr><td>County</td><td><sf:input name = "ad_county" path="ad_county" type="text"/><br/><sf:errors path="ad_county" cssClass="error"></sf:errors></td></tr> 
<tr><td>Contact Number</td><td><sf:input name = "contact_num" path="contact_num" type="text"/><br/><sf:errors path="contact_num" cssClass="error"></sf:errors></td></tr> 
<tr><td>Emergency Contact Name</td><td><sf:input name = "em_con_name" path="em_con_name" type="text"/><br/><sf:errors path="em_con_name" cssClass="error"></sf:errors></td></tr> 
<tr><td>Emergency Contact Number</td><td><sf:input name = "em_con_num" path="em_con_num" type="text"/><br/><sf:errors path="em_con_num" cssClass="error"></sf:errors></td></tr> 
<tr><td><input value="Register" type="submit"/></td></tr> 

</table> 
</sf:form> 

這只是一個部分頁面,因爲我使用Apache Tiles和我省略了對C腳本竊聽密碼。

正如我所說的,這與@Valid註釋工作正常,但由於我從jdbc切換到休眠,我失去了驗證。我希望用戶的密碼字段介於5-15之間,但由於我正在對它們進行加密,所以Hibernate在將它們寫入數據庫時​​不會讓它們通過驗證。

我對用戶的理解是點擊了Register,它映射到createmembers.jsp(它實際上是使用header.jsp,footer.jsp和createmembers.jsp的Apache tiles) - 這個jsp包含一個連接到寄存器的表單在我的控制器中映射並將用戶對象添加到模型中。然後,寄存器方法讀取對象,進行驗證,如果一切正常,則寫入數據庫。如果不好,則返回到createmembers頁面,否則返回registerSuccess頁面。就像我說過的,我確實使用Valid Validation和JDBC進行驗證,但是在驗證Spring和Hibernate時,我需要修正它。


回答

0

修正了它。我必須明確註釋用戶作爲模型屬性。這是新的方法簽名。

public String doRegister(Model model, @Validated(FormValidationGroup.class) @ModelAttribute("member") User member, BindingResult result)