Может ли Spring MVC поймать исключение и вернуть BindingResult в ответ для всех контроллеров?

Я пытаюсь использовать существующую структуру проверки на уровне службы моего приложения, которая выдает исключение ValidationException в случае сбоев проверки. Этот объект исключения содержит несколько ошибок, и я хочу использовать обработчик исключений в Spring MVC для извлечения этих ошибок и возврата сообщений проверки в представление (thymeleaf).

Итак, у меня есть два вопроса о том, как это сделать:

1) Могу ли я вручную создать объект BindingResult из списка пользовательских объектов ошибок для передачи на уровень представления?

2) Могу ли я поймать исключение ValidationException из обработчика в базовом контроллере (может быть вызвано несколькими методами) и перехватить ответ и вернуть представление с сообщениями проверки? Или мне нужно попробовать/отловить это исключение в каждом методе контроллера, где оно может быть выброшено, и вытащить оттуда результат привязки?

Очевидно, было бы лучше, если бы все это происходило в одном месте — если один обработчик может перехватывать ValidationException и вводить сообщения об ошибках в представление. Но будет ли этот метод иметь доступ к возвращенной модели и представлению? Любые советы по этой архитектуре будут очень полезны.


person ant-depalma    schedule 12.08.2016    source источник


Ответы (1)


Вы проверили Google? Мой первый хит: https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc
Это позволит вам вернуть представление для желаемых исключений с правильной моделью.

Также посмотрите документацию spring для обработчика исключений? http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/HandlerExceptionResolver.html

Тогда возникает вопрос, как можно получить результат привязки. Если я погуглю, похоже, что он доступен как атрибут запроса: Перехватчик веб-запросов Spring 3 - как мне получить BindingResult?

person Koos Gadellaa    schedule 12.08.2016
comment
Спасибо, это почти готово - проблема в обработчике исключений, если я поймаю исключение ValidationException, я не знаю, какое представление вернуть (это не общее представление - я хочу, чтобы это была последняя отправленная страница) Единственное, о чем я могу думать, это посмотреть на реферера или передать представление в качестве атрибута запроса, что довольно уродливо. - person ant-depalma; 13.08.2016
comment
Вы обязательно должны посмотреть на реферера. Если вы используете Post-Redirect-Get, реферер должен быть именно той страницей, на которую вы хотите вернуться (поскольку последний запрос был Get). Другой вариант - иметь отдельный фильтр/обработчик-перехватчик, который добавляет последнее представление к сеансу, а затем использовать его, но для этого требуется использование сеансов. Если вы используете сеансы, это может быть вашим самым простым решением: пусть он вернет ранее возвращенное представление! - person Koos Gadellaa; 13.08.2016