Spring MVC - 异常处理器

1. 什么是异常处理器?

SpringMVC 在处理请求的过程中出现异常情况,可以采用 异常处理器 进行应对。简单来说,处理器在处理请求执行过程中出现异常,跳转到对应的视图,在视图上展示友好的信息。

SpringMVC为异常处理提供了一个异常处理接口:HandlerExceptionResolver

public interface HandlerExceptionResolver {
    @Nullable
    //返回一个ModelAndView 对象,表示异常处理跳转那个界面
    ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, @Nullable Object handler, Exception ex);
}

HandlerExceptionResolver 接口的实现目录,其中 DefaultHandlerExceptionResolver 和 SimpleMappingExceptionResolver 是最常用。

2. 默认的异常处理器

DefaultHandlerExceptionResolver 是SpringMVC 默认的异常处理器。核心方法如下:

    protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, @Nullable Object handler, Exception ex) {
        //源代码中通过 判断业务抛出的异常信息,调用相对应的方法将状态码和错误信息封装到一个ModelAndView对象中,并将ModelAndView对象返回。
    }

3. 自定义异常处理器

SimpleMappingExceptionResolver 是SpringMVC 提供给开发者自定义异常处理的处理器。其核心方法:

    @Nullable
    protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, @Nullable Object handler, Exception ex) {
        //获取视图名称
        String viewName = this.determineViewName(ex, request);
        if (viewName != null) {
            //获取状态码
            Integer statusCode = this.determineStatusCode(request, viewName);
            if (statusCode != null) {
                //将状态码,保存在 response中
                this.applyStatusCodeIfPossible(request, response, statusCode);
            }
            //创建一个ModelAndView对象,通过ModelAndView方式将 异常信息和自定义的页面 保存在 request域中,并 return。
            return this.getModelAndView(viewName, ex, request);
        } else {
            return null;
        }
    }

3.1 配置文件方式

通过在 springmvc.xml 文件中配置自定义异常处理,指定异常展示页面。配置信息如下:

    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <!--这里用来指定异常出现之后跳转的视图,可以配置多个键值对-->
            <props>
                <!--key是异常,要提供具体的异常类型,包括包名-->
                <!--这种方式标志出现 IllegalAccessException,就会跳转ex2视图-->
                <prop key="java.lang.IllegalAccessException">ex2</prop>
                <!--这种方式代表只要出现异常,都会跳转下面指定的页面-->
                <prop key="java.lang.Exception">页面名称1</prop>
            </props>
        </property>
        <!--将异常信息存储到 request域中,value属性用来指定存储时的key。 底层: request.setAttribute("ex", 异常对象);-->
        <property name="exceptionAttribute" value="ex"/>
    </bean>

3.2 注解方式

通过注解方式直接自定义一个异常处理器,通过域数据共享的方式来将信息响应到指定页面中。代码如下:

@ControllerAdvice
public class ExceptionController {

    @ExceptionHandler
    public String ex1(Exception e, Model model){ //这里参数 model map modelMap都可以
        //异常信息自定义处理,可以在此处,也可以另写方法进行处理
        //将数据封装到 request域中
        model.addAttribute("ex",e);
        return "页面名称";
    }

    @ExceptionHandler
    public ModelAndView ex2(Exception e){
        String viewName = "页面名称";
        ModelAndView mv = new ModelAndView(viewName);
        mv.addObject("ex", e);
        return mv;
    }
}
  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值