Spring MVC + Hibernate: стратегии проверки данных

Все мы знаем, что Spring MVC хорошо интегрируется с Hibernate Validator и JSR-303 в целом. Но Hibernate Validator, как кто-то сказал, предназначен только для Bean Validation, что означает, что более сложные проверки должны передаваться на уровень данных. Примеры таких проверок: уникальность бизнес-ключа, зависимость внутри записей (что обычно указывает на проблемы проектирования БД, но мы все живем в несовершенном мире). Даже простые проверки, такие как длина строкового поля, могут быть вызваны некоторым значением БД, что делает Hibernate Validator непригодным для использования.

Итак, мой вопрос: есть ли что-то, что предлагает Spring, Hibernate или JSR для выполнения таких сложных проверок? Есть ли некоторыеустановленный образец или технологический элемент для выполнения такой проверки в стандартной настройке Controller-Service-Repository на основе Spring и Hibernate?

ОБНОВИТЬ: Позвольте мне быть более конкретным. Например, тамs форма, которая отправляет запрос сохранения 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;
}

Можете ли вы предложить более оптимальный подход?

Ответы на вопрос(1)

Ваш ответ на вопрос