SpringMVC——基于XML和注解 配置全局统一异常映射

异常映射的作用:

统一管理项目中的异常
抛出异常
显示异常信息

  1. 普通请求:在页面上显示异常信息
  2. Ajax 请求:返回 JSON 数据

在springmvc中,一个请求如果是由mvc:view-controller处理的,在这过程中如果抛出了异常,那么就得用基于xml的异常映射来捕获处理这个异常。如果请求是有@RequestMapping这个注解来处理的,在这过程中发生了异常,那么就得使用基于注解的异常映射来捕获并处理这个异常。

mvc:view-controller是在springmvc.xml配置文件配置的
在这里插入图片描述
正因为view-controller是在xml配置的,所以他需要基于xml实现异常映射!


注意:通过@RequestMapping这个注解来处理的请求,在这个过程中抛出了异常,就会找基于注解的异常映射进行处理,如果没有配置基于注解的异常映射,那么就会找基于xml的异常映射

在这里插入图片描述

基于xml的异常映射实现:SimpleMappingExceptionResolver

 <!--配置基于xml的异常映射-->
    <!--是一个bean, SimpleMappingExceptionResolver-->
    <bean id="simpleMappingExceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <!--属性是exceptionMappings-->
        <property name="exceptionMappings">
            <props>
                <!--key 是异常的类型-->
                <!--标签体中是要映射的页面 他会根据视图解析器的配置映射成一个完整路径下的页面-->
                <prop key="java.lang.Exception">system-error</prop>
            </props>
        </property>
    </bean>

1.exceptionMappings是SimpleMappingExceptionResolver的一个成员属性。

2.prop中的system-error会经过视图解析器处理,所以如果发生java.lang.Exception异常就会跳转到system-error.jsp页面

基于注解的异常映射实现

这里就涉及两个注解了:

@ControllerAdvice:这个注解就是增强型控制器,代表这是基于注解的异常映射

@ExceptionHandler:将一个具体的异常类型和一个方法关联起来

步骤:

1.创建一个类,类上添加@ControllerAdvice注解
在这里插入图片描述
2. 写一个通用的异常处理方法,根据思路编写代码

 private ModelAndView commonResolveException(HttpServletRequest request,
                                                HttpServletResponse response,
                                                Exception exception,
                                                String viewName) throws IOException {
        // 1.根据request获取请求
        boolean judgeResult = CrowdUtil.judgeRequestType(request);
        // 2.判断请求的类型
        if (judgeResult) {
            // 3. ajax请求
            //  4. 调用ResultEntity的failed方法
            ResultEntity<Object> failed = ResultEntity.failed(exception.getMessage());
            //5 将ResultEntity对象转成JSON格式的数据
            Gson gson = new Gson();
            String json = gson.toJson(failed);
            //6.将JSON格式的数据作为响应体数据返回给浏览器
            response.getWriter().write(json);
            //7.返回null,不给SpringMVC提供ModelAndView对象
            return null;
        }
        //普通请求
        //8.创建ModelAndView对象
        ModelAndView modelAndView = new ModelAndView();
        // 9 将exception对象存入模型
        modelAndView.addObject(CrowdConstant.ATTR_NAME_EXCEPTION, exception);
        //10  设置目标视图名称,跳转到哪里
        modelAndView.setViewName(viewName);
        //11. 返回视图模型
        return modelAndView;
    }

这里涉及到一个工具类CrowdUtil,该工具类的作用是判断请求的类型 相关代码如下:

public class CrowdUtil {

    /**
     *  根据请求头中的accpet和X-Requested-With判断请求是普通请求还是ajax请求
     * @return
     *  true:代表是ajax请求
     *  false: 代表 普通请求
     */
    public static boolean judgeRequestType(HttpServletRequest request){
        // 1.获取请求头信息
        String accept = request.getHeader("Accept");
        String requestHeader = request.getHeader("X-Requested-With");
        //2 判断是普通请求还是ajax请求
        return (accept != null  && accept.equals("application/json"))
                ||
                (requestHeader != null  && requestHeader.equals("XMLHttpRequest"));

    }
}

当然,也可以写一个或者多个具体异常处理 ,比如空指针异常NullPointException

  /**
     * 针对空指针异常处理
     * @param request
     * @param response
     * @param exception
     * @return
     * @throws IOException
     */
    @ExceptionHandler(NullPointerException.class)
    public ModelAndView resolveNullPointException(HttpServletRequest request,HttpServletResponse response,NullPointerException exception) throws IOException {

        String viewName="system-err";
        return commonResolveException(request,response,exception,viewName);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值