가 일부 필드에 최대 절전 모드의 검증 주석을 가진 클래스가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 주석을 갖는 것과 동일한 유효성 검사기를 호출하여 호출하려고합니다. 이 유효성 검사기를 어떻게 사용할 수 있습니까?
난 당신이 유효성 검사 그룹을 사용할 수 있다고 생각합니다. 'machineName' (또는 이전과 새로운 이름을 비교하는 커스텀 유효성 검사기)에있는'@ NotNull "이외의 모든 유효성 검사를 기본 그룹에두고 나머지 유효성 검사기를'Update' 그룹에 넣으십시오. 'updateMyObject' 메소드에서 두 그룹을 모두 사용하십시오. http://docs.jboss.org/hibernate/validator/5.0/reference/en-US/html/chapter-groups.html#d0e2595 –