Мы все знаем, что Spring MVC хорошо интегрируется с Hibernate Validator и JSR-303 в целом. Но Hibernate Validator, как сказал кто-то, является чем-то только для Bean валидации, а это значит, что более сложные проверки должны быть перенесены на уровень данных. Примеры таких валидаций: уникальность бизнес-ключа, зависимость внутри записей (что обычно указывает на проблемы проектирования БД, но все мы живем в несовершенном мире). Даже простые проверки, такие как длина строкового поля, могут управляться некоторым значением DB, что делает невозможным использование Hibernate Validator.
Итак, мой вопрос: есть ли что-то Spring или Hibernate или JSR предлагает выполнить такие сложные проверки? Есть ли определенный шаблон или часть технологии для выполнения такой проверки в стандартной настройке Controller-Service-Repository на основе Spring и Hibernate?
ОБНОВЛЕНИЕ: Позвольте мне уточнить. Например, существует форма, которая отправляет запрос сохранения AJAX в контроллер save
. Если возникает какая-либо ошибка проверки - либо простая, либо "сложная" - мы должны вернуться в браузер с помощью некоторого json, указывающего на проблемное поле и связанную с ним ошибку. Для простых ошибок я могу извлечь поле (если есть) и сообщение об ошибке из BindingResult
. Какую инфраструктуру (возможно, конкретные, а не специальные исключения?) Вы бы предложили для "сложных" ошибок? Использование обработчика исключений не кажется мне хорошей идеей, потому что разделение одного процесса валидации между методом save
и @ExceptionHandler
делает вещи сложными. В настоящее время я использую какое-то специальное исключение (например, ValidationException
):
public @ResponseBody Result save(@Valid Entity entity, BindingResult errors) {
Result r = new Result();
if (errors.hasErrors()) {
r.setStatus(Result.VALIDATION_ERROR);
// ...
} else {
try {
dao.save(entity);
r.setStatus(Result.SUCCESS);
} except (ValidationException e) {
r.setStatus(Result.VALIDATION_ERROR);
r.setText(e.getMessage());
}
}
return r;
}
Можете ли вы предложить более оптимальный подход?