2012-04-03 3 views
4

유효성 검사를 위해 Spring 3을 사용하고 싶습니다.스프링 3 유효성 검사를 사용하는 두 가지 방법은 무엇입니까?

참조 문서에서 6.2 절에서는 유효성을 검사하려는 클래스에 구현할 수있는 Validator 인터페이스에 대해 설명합니다. Validator 클래스를 만드는 방법은 설명하고 있지만 객체의 유효성을 검사하는 방법은 설명하지 않습니다.

섹션 6.7에서는 JSR-303 API와 함께 제공되는 특수 효과를 다룹니다. 그것은 객체를 검증하는 다른 방법입니다 (이 경우, Validator 클래스를 생성하지 않고 주석을 사용하는 것).

스프링 밸리데이션을 사용하는 방법은 정말 두 가지가 있습니까?

간단한 질문 하나, JSR-303 API의 구현이 클래스 경로에 있어야한다고 명시되어 있습니다. 제안 된 구현 중 하나는 Hibernate-Validator입니다. Spring은 구현을 제공합니까?

감사

답변

5

예, 두 가지 방법이 있습니다

  • 검사기 인터페이스 봄이는 동안 JSR 303은 새로운 2
  • 이, 존재하지 않는 주로 봄에 사용 된 이전이다 빌드

JSR 303을 사용하는 것이 좋습니다. 제 생각에는 오래된 유효성 검사기를 사용해야하는 유일한 이유가 있습니다. 즉, 많은 교차 필드 검증이 필요한 경우입니다. JSR 303을 사용하려면 (예 : Hibernate-Validator (JSR 303의 기본 구현)) (Hibernate-Validator와 같은) 유효성 검사기 구현을 추가해야합니다. Validator는 Hibernate ORM이 아니며, 단지 관련이 있습니다.)

이것은 JPA와 약간 비슷합니다. 공통 중립적 인 사양 (javax.jpa/javax.validation)과 다른 공급자 구현 (예 : JPA의 경우 : EclipseLink 또는 Hibernate)


이 예제는 유효성을 테스트하는 예제입니다 (테스트의 목표는 te 당신은 단지 추가해야

public class NotEmptyTest { 

    public static class Demo { 

     @NotEmpty 
     String string; 

     public Demo(final String string) { 
      this.string = string; 
     } 
    } 

    @Test 
    public void testNotEmptysWithValid() { 
     /** given: a valid object */ 
     Demo valid = new Demo("hallo Welt"); 

     ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); 
     Validator validator = factory.getValidator(); 

     /** then there must not be any constraint violations */ 
     AssertUtil.isEmpty(validator.validate(valid)); 
    } 

    @Test 
    public void testNotEmptyInValid() { 
     /** given: an invalid object */ 
     Demo valid = new Demo(""); 

     ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); 
     Validator validator = factory.getValidator(); 

     /** then there must not be one constraint violation */ 
     Set<ConstraintViolation<Demo>> result = validator.validate(valid); 

     AssertUtil.hasSize(1, result); 
     ConstraintViolation<Demo> firstItem = result.iterator().next(); 
     Assert.assertEquals("{org.hibernate.validator.constraints.NotEmpty.message}", 
       firstItem.getMessageTemplate()); 
    } 
} 

하지만, 스프링 MVC 컨트롤러에 훨씬 쉽게 : 성 검증 자체, 그러나 나는 어쨌든이 방법 유효성을 테스트하는 방법을 설명한다) 공통의 하나에 검사기를 변경 명령 개체의 매개 변수 @Valid 및 명령 개체의 매개 변수

@RequestMapping(method = RequestMethod.POST) 
public ModelAndView create(@Valid UserCreateCommand userCreateCommand, 
     BindingResult bindingResult) { 

    if (bindingResult.hasErrors()) { 
     //show form again 
    } else { 
     //create user and 
     //redirect To Show user 
    } 
} 

후 직접 BindingResult 매개 변수를 추가해야합니다 그리고 UserCreateCommand 그냥 필드 JSR303 검증 제약이 많은 주석되는 POJO이다. 답에 대한

public class UserCreateCommand { 

    @Length(min = 2) 
    @NotBlank 
    private String login; 

    @Email 
    @NotNull 
    private String emailAddress; 

    .... 

    //GETTER and SETTER 
} 
+0

감사합니다. 하나의 도메인 클래스와 해당 단위 테스트로 간단한 예제를 제공 할 수 있습니까? 이 클래스의 유효성을 검사하기 위해 Spring을 설정하는 방법을 알고 싶습니다. 도와 주셔서 정말로 고맙습니다. –

+0

예를 들어 주셔서 감사합니다.NotEmptyTestClass에서 응용 프로그램 컨텍스트에서 LocalValidatorFactoryBean을 선언 할 수 있습니다. 맞습니까? 그런 다음이 ValidatorFactory에서 Validator를 가져와야합니다. UserCreateCommand 인스턴스에서 validate 메소드를 호출하면 JSR-303 주석에 따라 유효성 검증 메소드가 유효한지 확인합니다. (저는 MVC를 사용하지 않기 때문에 일반적인 경우에 어떻게 동작하는지 모르겠습니다). –

+0

나는 마지막 코멘트를 100 % 이해하지 못한다. 그러나 테스트는 스프링없이 작동합니다 (이 의미는 스프링 컨텍스트 없음)! 반면에 Validator를 Spring Bean에 주입 할 수 있어야합니다. 중요한 점은 "봄 콩"은 모든 수업이 봄 콩이 아니라는 것입니다. 필자의 예에서는 Controller가 유일한 Spring Bean입니다. (당신은 "@Configurable"을 봐야한다.) – Ralph

0
We can use two level of validation in spring 

1.)using annotation 
2.)using properties file 

in .jsp 
-------------- 

<style type="text/css"> 
.errors { 
    color: red; 
} 


.errorblock { 
    color: #000; 
    background-color: #ffEEEE; 
    border: 3px solid #ff0000; 
    padding: 8px; 
    margin: 16px; 
} 

</style> 


<c:url value="saveUser" var="saveUser"/> 
<form:form action="${saveUser}" method="post" commandName="user"> 
<table> 
<form:errors path="*" cssClass="errorblock" element="div"></form:errors> 
<tr> 
<td>User Id:</td> 
<td><form:input path="userId"/> 
<form:errors path="userId" cssClass="errors"></form:errors> 
</td> 
</tr> 
<tr> 
<td>Password:</td> 
       <td><form:password path="password" /> 
       <form:errors path="password" cssClass="errors"></form:errors> 
</td> 
</tr> 
      <tr> 
       <td colspan='2'><input name="submit" type="submit" 
        value="submit" /> 
       </td> 
      </tr> 
      <tr> 
       <td colspan='2'><input name="reset" type="reset" /> 
       </td> 
      </tr> 
     </table> 
</form:form> 


User.java 
---------------------------- 

import org.hibernate.validator.constraints.NotEmpty; 


public class User { 
    @NotEmpty(message="UserId is Required") 
    private String userId; 
     @NotEmpty 
    private String password; 
    public String getPassword() { 
     return password; 
    } 
    public void setPassword(String password) { 
     this.password = password; 
    } 
    public String getUserId() { 
     return userId; 
    } 
    public void setUserId(String userId) { 
     this.userId = userId; 
    } 

} 

UserController.java 
-------------------- 

@RequestMapping(value="/saveUser" ,method=RequestMethod.POST) 
public String saveUser(@Valid @ModelAttribute User user,BindingResult bindingResult) 
{ 
    System.out.println("in register"+user.getPassword()); 
    if(bindingResult.hasErrors()) 
    { 
    return "register"; 
    } 
    return "login"; 
} 

in dispatcher-servlet.xml 
-------------------------- 
<bean id="messageSource" 
     class="org.springframework.context.support.ResourceBundleMessageSource"> 
     <property name="basenames"> 
     <list> 
       <value>message</value> 
      </list> 
     </property> 
    </bean> 

message.properties(put this file in classpath) 
--------------------- 
NotEmpty.user.password = password is required! 
관련 문제