2016-08-12 2 views
1

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

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

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

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

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

ответ

3

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

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

Тогда возникает вопрос, как можно восстановить привязку. Если я использую Google для него, это выглядит как атрибут запроса: Spring 3 web request interceptor - how do I get BindingResult?

+0

Спасибо, это почти что - проблема в обработчике исключений, если я поймаю исключение ValidationException, я не знаю, какой вид для возврата (это не общий вид - я хочу, чтобы это была последняя страница, которая была отправлена). Единственное, что я могу думать, это посмотреть на реферера или передать представление как атрибут запроса, что довольно уродливо. – user842800

+0

Вы должны определенно взглянуть на референта. Если вы используете Post-Redirect-Get, референт должен быть именно той страницей, на которой вы хотите вернуться (поскольку последний запрос был Get). Другой вариант - иметь отдельный фильтр/handlerinterceptor, который добавляет последнее представление к сеансу, а затем использовать его, но для этого требуется использование сеансов. Если вы используете сеансы, это может быть ваше самое простое решение: пусть он вернет представление, которое было возвращено ранее! –