У меня есть класс с аннотацией проверки гибернации на некоторых полях (например, @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-аннотация. Как я могу найти этот валидатор и использовать его?