Существует три основных способа обработки потока исключений с помощью 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
|
@Bean public 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
|
@Controller public class AController { @ExceptionHandler (IOException. class ) public String handleIOException(IOException ex) { return "errorView" ; } } |
Во втором варианте @ExceptionHandler аннотация может быть применена ко ВСЕМ классам контроллера путем аннотирования метода аннотируемого класса @ControllerAdvice:
1
2
3
4
5
6
7
|
@ControllerAdvice public class AControllerAdvice { @ExceptionHandler (IOException. class ) public String handleIOException(IOException ex) { return "errorView" ; } } |
По сути, это подходы к обработке исключений приложений в приложениях Spring MVC.