SpringMVC 中异常处理器 HandlerExceptionResolver介绍

2022-01-06 0 By admin

在SpringMVC中,提供了一个全局异常处理器,用于对系统中出现的异常进行统一处理。
在一般的系统中,DAO层、Service层及Controller层出现异常都以“throws Exception”的形式向上层抛出,最后都会由 SpringMVC的前端控制器(DispatcherServlet)统一交由全局异常处理器进行异常处理。

一、HandlerExceptionResolver 接口介绍

在SpringMVC中提供的 HandlerExceptionResolver 接口,可以实现全局异常处理器,该接口的源码如下:

package org.springframework.web.servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.lang.Nullable;
 
public interface HandlerExceptionResolver {
    @Nullable
    ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex);
}

可以看到,HandlerExceptionResolver 接口中定义了一个名为 resolveException的方法。
该方法主要用于处理Controller中的异常。

  1. 参数“Object handler”就是处理器适配器要执行的Handler对象。
  2. 参数“Exception ex” 即为Controller或其下层抛出的异常。
  3. 返回值类型是ModelAndView,也就是说,可以通过这个返回值来设置发送异常时的显示页面。

二、基于配置文件和注解方式配置异常处理器示例

HandlerExceptionResolver接口的实现类有:DefaultHandlerExceptionResolver和SimpleMappingExceptionResolver。
其中通过 SimpleMappingExceptionResolver 可以实现自定义的异常处理器。

2.1、基于配置文件的方式

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="exceptionMappings">
        <props>
        	<!--
        		properties的键表示处理器方法执行过程中出现的异常
        		properties的值表示若出现指定异常时,设置一个新的视图名称,跳转到指定页面
        	-->
            <prop key="java.lang.ArithmeticException">error</prop>
        </props>
    </property>
    <!--
    	exceptionAttribute属性设置一个属性名,将出现的异常信息在请求域中进行共享
    -->
    <property name="exceptionAttribute" value="ex"></property>
</bean>

2.2、基于注解的方式

@ControllerAdvice将当前类标识为异常处理的组件。

@ControllerAdvice
public class ExceptionController {
    //@ExceptionHandler用于设置所标识方法处理的异常
    @ExceptionHandler(ArithmeticException.class)
    //ex表示当前请求处理中出现的异常对象
    public String handleArithmeticException(Exception ex, Model model){
        model.addAttribute("ex", ex);
        return "error"; //视图解析器
    }
}