Статьи

Spring MVC Поток обработки ошибок

Существует три основных способа обработки потока исключений с помощью 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.

Ссылка: Spring MVC Поток обработки ошибок от нашего партнера JCG Биджу Кунджуммена в блоге all and sundry.