У меня есть класс с аннотацией проверки спящего режима в некоторых полях (например, @NotNull
и @Size(min = 4, max = 50)
и т. д.)
public class MyClass {
Long id;
@NotEmpty
@Size(min = 4, max = 50)
String machineName;
@NotEmpty
@Size(min = 4, max = 50)
String humanName;
// Getters, setters, etc…
}
У меня также есть собственный контроллер, который действует как JSON API, и десериализатор JSON, который создает объекты MyClass при вызове методов API. В моем пользовательском контроллере у меня есть метод для создания нового объекта этого типа:
@RequestMapping(method = RequestMethod.POST)
public long createMyObject(@RequestBody @Valid MyClass newObj) {
// Create the object in the database
return newObj.getId();
}
и еще один метод, который обновляет существующий объект
@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
}
Хотя я могу использовать @Valid
в createMyObject
, я не могу использовать его в updateMyObject
, потому что наша реализация API требует, чтобы имя_машины оставалось неизменным — пользователи могут вызывать API с объектом JSON, который либо полностью исключает имя_машины, либо заполняет его тем же значением, которое существует в базе данных. .*
Перед сохранением обновленного объекта в базе данных я хочу вызвать тот же валидатор, который вызовет аннотацию @Valid. Как я могу найти этот валидатор и использовать его?
@NotNull
наmachineName
(или пользовательского валидатора, который сравнивает старое и новое имя), должны быть в группе по умолчанию, а оставшийся валидатор должен быть в группеUpdate
. Используйте обе группы в методеupdateMyObject
. См. docs.jboss.org /hibernate/validator/5.0/reference/en-US/html/ - person Eric Jablow   schedule 04.07.2013