2015-02-27 1 views
2

Как заставить Spring всегда конвертировать неперехваченное исключение в JSON вместо HTML-страницы?Force Spring всегда сообщает об исключениях как JSON

Это то, что я получаю, когда запрос сделан из REST клиента плагин Chrome:

{ 
timestamp: 1425041457798 
status: 404 
error: "Not Found" 
exception: "com.some.my.Exception" 
message: "/rrr does not exist" 
path: "/test/rrr" 
} 

Но это то, что я получаю, когда я к нему доступ из браузера или из Jersey API (вы видите разобранный HTML):

Ошибка Whitelabel Page

Это приложение не имеет явного сопоставления для/error, поэтому вы видите это как резерв.

Пятница 27 февраля 13:37:27 CET 2015Произошла непредвиденная ошибка (type = Not Found, status = 404). Нет сообщения, доступного

Я знаю, что это можно сделать как угодно, установив заголовки запроса, но я хочу, чтобы JSON-ответ быть единственным вариантом.

ответ

0

Для начала нужно добавить исключающее средство для исключения, которое запускает внутри контроллеров. Я предпочитаю продление ResponseEntityExceptionHandler и добавьте свой метод, но есть замечательная статья о spring.io: http://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc

После этого, если вы по-прежнему получаете следующую страницу, вы можете переопределить org.springframework.boot.autoconfigure.web.ErrorController. Есть пример: BasicErrorController. Но это работает только в том случае, если вы используете весеннее загрузочное приложение со встроенным контейнером. Например, если вы создадите проект весенней загрузки формы войны и развернете его под tomcat, вы получите стандартную страницу ошибок tomcat.

Так что это означает, что ErrorController не является общим решением.

В моем случае я выбрасывает исключения внутри фильтров, поэтому /error страница показана. Таким образом, решение будет писать собственный фильтр, который преобразует исключения в представление JSON. Это решение должно работать для каждого контейнера/сервера, и вы можете получить дополнительную информацию об исключении.

Смежные вопросы