2014-01-21 2 views
0

스프링에서 유효성 검사 그룹을 사용하려하지만 작동하지 않는 것 같습니다.스프링 그룹 유효성 검사

@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"; 
    } 

내가 강조 표시 한 부분이 변경 모든입니다. BindingResult도 빈 이름 요청 속성으로 사용할 '회원'에 대한 일반 대상 객체가 모두

JSP 페이지가

을 다음과 같다 :

추적에서 관련 오류가

이 java.lang.IllegalStateException 것 같다

코드 :

<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> 

그것은 내가 아파치 타일을 사용하고 같은 단지 부분 페이지, 그리고 전 C에 대한 스크립트를 남겨 두었다 암호를 묻습니다.

내가 말했듯이 @Valid 주석으로는 잘 작동하지만 jdbc에서 최대 절전 모드로 전환 할 때 유효성이 손실됩니다. 사용자를 위해 5-15 사이의 암호 필드를 원하지만 Hibernate는 데이터베이스를 암호화 할 때 유효성 검사를 통과하지 못하게합니다.

사용자가 이해할 수 있도록 Register를 클릭하면 createmembers.jsp (실제로 header.jsp, footer.jsp 및 createmembers.jsp를 사용하는 Apache 타일)에 매핑됩니다.이 jsp에는 레지스터에 연결되는 양식이 포함되어 있습니다 내 컨트롤러에서 매핑하고 사용자 개체를 모델에 추가합니다. 그런 다음 register 메소드는 해당 객체를 읽고 유효성 검사를 수행하며 모든 것이 좋으면 데이터베이스에 기록합니다. 좋지 않으면 createmembers 페이지로 돌아갑니다. 그렇지 않으면 registerSuccess 페이지로 이동합니다. 앞서 말했듯이 Validation은 @ Valid 주석과 JDBC로 작업했지만 Spring과 Hibernate의 유효성을 검사 할 때마다 조금 수정해야합니다.


답변

0

수정 됨. 사용자에게 모델 속성으로 명시 적으로 주석을 추가해야했습니다. 여기에 새로운 메소드 서명이 있습니다.

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