SPRINGMVC中的异常处理机制

1. 概述

SpringMVC提供了基于xml和基于注解的异常处理机制,一般情况下两者都要进行配置,xml异常处理机制主要用于处理xml方式产生的异常,注解异常处理机制主要用于处理基于注解方式产生的异常。

2. 基于xml方式的异常处理机制

 
<!--配置基于xml的异常映射-->
<bean id="simpleMappingExceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<!--key属性指定具体的出错类型,标签体中为对应的出错页面(这个值会拼上前后缀以得到全路径)-->
<prop key="java.lang.Exception">system-error</prop>
</props>
</property>
</bean>

3. 基于注解方式的异常处理

步骤:

  1. 使用@ControllerAdvice注解表名此类为异常处理类
  2. 方法上使用@ExceptionHandler注解表示此方法处理何种异常,如
    @ExceptionHandler(value = ArithmeticException.class)

4. 实际应用

一般若是普通请求产生的异常,则应该返回错误页面,若是Ajax请求返回的是相应的JSON字符串。

  1. 判断一个请求是否是Ajax请求

    请求依据:(两者含其一则为Ajax请求)

    • 请求头中Accept中包含application/json
    • 请求头中X-Requested-With字段为XMLHttpRequest的为Ajax请求
     
      
    /**
    * 判断此次请求是否是Ajax请求
    * @param request 此次请求对应的request对象
    * @return true表示是Ajax请求,false表示是普通请求
    */
    public static boolean isAjax(HttpServletRequest request) {
    String accept = request.getHeader("Accept");
    String xRequestHeader = request.getHeader("X-Requested-With");
    return accept != null && accept.contains("application/json")
    ||
    xRequestHeader != null && xRequestHeader.equals("XMLHttpRequest");
    }
  2. 配置基于xml方式的异常处理机制

  3. 配置基于注解方式的异常处理

     
      
    package com.wuw.crowd.mvc.config;
    import com.google.gson.Gson;
    import com.wuw.crowd.exception.LoginFailedException;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.servlet.ModelAndView;
    import com.wuw.crowd.util.CrowdUtil;
    import com.wuw.crowd.constant.CrowdConstant;
    import com.wuw.crowd.util.ResultEntity;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    /**
    * @description: 基于注解的异常处理机制
    * @author: WuW
    * @create: 2022/5/2 18:36
    */
    @ControllerAdvice
    public class MyExceptionResolver {
    @ExceptionHandler(value = ArithmeticException.class)
    public ModelAndView resolveArithmeticException(HttpServletRequest request, HttpServletResponse response, NullPointerException exception) throws IOException {
    String viewName = "system-error";
    return commonResolve(viewName, exception, request, response);
    }
    @ExceptionHandler(value = NullPointerException.class)
    public ModelAndView resolveNullPointerException(HttpServletRequest request, HttpServletResponse response, NullPointerException exception) throws IOException {
    String viewName = "system-error";
    return commonResolve(viewName, exception, request, response);
    }
    @ExceptionHandler(value = LoginFailedException.class)
    public ModelAndView resolveLoginFailedException(HttpServletRequest request, HttpServletResponse response, LoginFailedException exception) throws IOException {
    String viewName = "admin-login";
    return commonResolve(viewName, exception, request, response);
    }
    /**
    * 抽取异常处理机制的公共部分
    * @param viewName 将要返回到哪个页面
    * @param exception 捕获到的异常信息
    * @param request 请求对象
    * @param response 响应对象
    * @return 返回ModelAndView
    * @throws IOException 响应对象获取输出流时抛出异常
    */
    private ModelAndView commonResolve(String viewName, Exception exception, HttpServletRequest request, HttpServletResponse response) throws IOException {
    boolean ajax = CrowdUtil.isAjax(request);
    // 如果是Ajax请求
    if (ajax) {
    // 创建ResultEntity对象
    ResultEntity<Object> failed = ResultEntity.failed(exception.getMessage());
    Gson gson = new Gson();
    // 将ResultEntity对象转换为JSON字符串
    String s = gson.toJson(failed);
    // 将JSON字符串作为响应体返回给浏览器
    response.getWriter().write(s);
    return null;
    }
    // 如果是普通请求
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject(CrowdConstant.ATTR_NAME_EXCEPTION, exception);
    // 设置对应的视图名称
    modelAndView.setViewName(viewName);
    return modelAndView;
    }
    }

    注:ResultEntity对象为统一响应对象,其中的failed方法实际上是将传入的exception对象封装成一个ResultEntity对象并返回给调用者。CrowdConstant类为自定义的常量类,主要用于存储各种常用的字符串,可有效预防写错单词导致的程序错误,在实际开发中十分有用。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

野生的狒狒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值