Существует три основных способа обработки потока исключений с помощью Spring MVC, цель которого — перехватить любое исключение приложения и предоставить пользователю дружественный и информативный обзор.
1. Использование тега error-page в файле web.xml:
Это подход, основанный на спецификациях сервлетов, в котором исключения, возникающие из приложения, перехватываются на основе либо кода ответа HTTP, либо типа исключения, а обработчик исключения указывается с помощью подтега location следующим образом:
|
1
2
3
4
5
6
7
8
|
<error-page> <error-code>500</error-code> <location>/500</location></error-page><error-page> <exception-type>java.lang.Exception</exception-type> <location>/uncaughtException</location></error-page> |
Если это приложение на основе Spring MVC, и если целью является представление Spring MVC для представления сообщения, то в идеале местоположение должно быть контроллером Spring, который может отображать содержимое, и это можно сделать для двух указанных выше положений, просто используя Конфигурация Spring MVC:
|
1
2
|
<mvc:view-controller path="/500" view-name="500view"/><mvc:view-controller path="/uncaughtException" view-name="uncaughtexception"/> |
2. Регистрация HandlerExceptionResolver :
HandlerExceptionResolver (s) отвечают за сопоставление исключения с представлениями. Самый простой подход заключается в регистрации SimpleMappingExceptionResolver, который может отображать типы исключений для просмотра имен. Ниже приведен способ регистрации SimpleMappingExceptionResolver с использованием определения bean-компонента Spring (на основе примеров Roo):
|
01
02
03
04
05
06
07
08
09
10
|
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" p:defaultErrorView="uncaughtException"> <property name="exceptionMappings"> <props> <prop key=".DataAccessException">dataAccessFailure</prop> <prop key=".NoSuchRequestHandlingMethodException">resourceNotFound</prop> <prop key=".TypeMismatchException">resourceNotFound</prop> <prop key=".MissingServletRequestParameterException">resourceNotFound</prop> </props> </property></bean> |
ИЛИ используя определение компонента на основе Java-конфигурации:
|
01
02
03
04
05
06
07
08
09
10
11
12
|
@Beanpublic HandlerExceptionResolver handlerExceptionResolver() { SimpleMappingExceptionResolver exceptionResolver = new SimpleMappingExceptionResolver(); exceptionResolver.setDefaultErrorView("uncaughtException"); Properties mappings = new Properties(); mappings.put(".DataAccessException", "dataAccessFailure"); mappings.put(".NoSuchRequestHandlingMethodException", "resourceNotFound"); mappings.put(".TypeMismatchException", "resourceNotFound"); mappings.put(".MissingServletRequestParameterException", "resourceNotFound"); exceptionResolver.setExceptionMappings(mappings ); return exceptionResolver;} |
3. Использование @ExceptionHandler
Это мой предпочтительный подход, и есть два варианта использования аннотации @ExceptionHandler.
В первом варианте @ExceptionHandler может быть применен к уровню класса контроллера, и в этом случае исключения, вызываемые теми же методами контроллера @RequestMapped, обрабатываются аннотированными методами @ExceptionHandler.
|
1
2
3
4
5
6
7
|
@Controllerpublic class AController { @ExceptionHandler(IOException.class) public String handleIOException(IOException ex) { return "errorView"; }} |
Во втором варианте @ExceptionHandler аннотация может быть применена ко ВСЕМ классам контроллера путем аннотирования метода аннотируемого класса @ControllerAdvice:
|
1
2
3
4
5
6
7
|
@ControllerAdvicepublic class AControllerAdvice { @ExceptionHandler(IOException.class) public String handleIOException(IOException ex) { return "errorView"; }} |
По сути, это подходы к обработке исключений приложений в приложениях Spring MVC.