2013-07-04 5 views
12

가 일부 필드에 최대 절전 모드의 검증 주석을 가진 클래스가Spring에서 @Valid 매개 변수를 사용하여 @RequestMethod 메서드에서 실행되는 것과 동일한 유효성 검사기를 프로그래밍 방식으로 호출하려면 어떻게해야합니까?

public class MyClass { 

    Long id; 

    @NotEmpty 
    @Size(min = 4, max = 50) 
    String machineName; 

    @NotEmpty 
    @Size(min = 4, max = 50) 
    String humanName; 

    // Getters, setters, etc… 
} 

(예 등 @NotNull@Size(min = 4, max = 50), ...로) 나는 또한 JSON의 API 역할을하는 사용자 정의 컨트롤러 및 JSON 디시리얼라이저가 그 API 메서드가 호출 될 때 MyClass 객체를 만듭니다.

@RequestMapping(method = RequestMethod.POST) 
public long createMyObject(@RequestBody @Valid MyClass newObj) { 
    // Create the object in the database 
    return newObj.getId(); 
} 

내가 createMyObject@Valid을 사용할 수 있지만, 내가 사용할 수 없습니다 기존 개체

@RequestMapping(method = RequestMethod.PUT) 
public void updateMyObject(@RequestBody MyClass updatedObj) { 
    MyClass existingObj = // Get existing obj from DB by updatedObj.getId(); 

    // Do some secondary validation, such as making sure that a specific 
    // field remains unchanged compared to the existing instance 
    if (existingObj.getMachineName() != null && 
      !existingObj.getMachineName().equals(updatedObj.getMachineName())) { 
     throw new CannotChangeMachineNameException(); 
    } 
    else { 
     updatedObj.setMachineName(existingObj.getMachineName()); 
    } 

    // [HERE IS WHERE I WANT THE MAGIC TO HAPPEN] 

    // Save updatedObj to the database 
} 

를 업데이트하는 또 다른 방법 : 내 사용자 정의 컨트롤러에서 그 유형의 새 객체를 생성하는 방법을 API 구현시 machineName이 변경되지 않아야하므로 updateMyObject에 있습니다. 사용자는 machineName을 완전히 제외하거나 데이터베이스에있는 동일한 값으로 채우는 JSON 객체를 사용하여 API를 호출 할 수 있습니다. *

업데이트 된 개체를 데이터베이스에 저장하기 전에 @Valid 주석을 갖는 것과 동일한 유효성 검사기를 호출하여 호출하려고합니다. 이 유효성 검사기를 어떻게 사용할 수 있습니까?

+1

난 당신이 유효성 검사 그룹을 사용할 수 있다고 생각합니다. 'machineName' (또는 이전과 새로운 이름을 비교하는 커스텀 유효성 검사기)에있는'@ NotNull "이외의 모든 유효성 검사를 기본 그룹에두고 나머지 유효성 검사기를'Update' 그룹에 넣으십시오. 'updateMyObject' 메소드에서 두 그룹을 모두 사용하십시오. http://docs.jboss.org/hibernate/validator/5.0/reference/en-US/html/chapter-groups.html#d0e2595 –

답변

6

컨트롤러 메서드에서 @Valid를 사용해야하는 것은 없습니다. 왜 당신은 @Valid로 주석을 달았던 매개 변수를 받아들이는 검증 메소드를 만들지 말고 그냥 똑같은 매개 변수를 반환하십시오. 이처럼

: 대안 Hibernate의 검증 패키지를 사용하는 것처럼

public Book validateBook(@Valid Book book) { 
    return book; 
} 

보인다. Here's it's documentation.

기본적으로, 당신은 ValidationFactory에서 Validator을 얻을, 다음과 같이 유효성 검사기 사용

@Test 
    public void manufacturerIsNull() { 
     Car car = new Car(null, "DD-AB-123", 4); 

     Set<ConstraintViolation<Car>> constraintViolations = 
      validator.validate(car); 

     assertEquals(1, constraintViolations.size()); 
     assertEquals("may not be null", constraintViolations.iterator().next().getMessage()); 
} 
+1

감사합니다. 첫 번째 방법이 효과가 없으므로 두 번째 방법과 비슷한 결과를 얻었습니다. Set > errors = Validation.buildDefaultValidatorFactory(). getValidator(). validate (updatedObj); // 당신이 지적한 문서에서 이것을 얻었다. – daniel