zoukankan      html  css  js  c++  java
  • springMVC--全局异常处理

    全局异常主要处理controller中抛出的异常,需注意controller中不需要捕获异常

    一、@ControllerAdvice + @ExceptionHandler 实现全局异常处理

    1、@ControllerAdvice 中申明@ExceptionHandler 方法,对所有controller中的@RequestMapping方法有效。

    2、@Controller 中申明@ExceptionHandler 方法,仅对当前controller中的@RequestMapping方法有效。

    全局异常处理类GlobalErrorHandler .java代码如下(需保证该类所在路径可以被扫描加载到spring容器):

    package com.tianwen.dcdp.exception.handler;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
    
    @ControllerAdvice
    public class GlobalErrorHandler {
    
        /**
         * 检查是否ajax请求
         * @param request
         * @return
         */
        public static boolean isAjax(HttpServletRequest request) {
            return request.getHeader("X-Requested-With") != null &&
                    "XMLHttpRequest".equalsIgnoreCase(request.getHeader("X-Requested-With"));
        }
        
        /**
         * 全局异常处理
         * @param request
         * @param response
         * @param ex
         * @return
         * @throws Exception
         */
        @ExceptionHandler(Exception.class)
        public Object errorHandler(HttpServletRequest request,
                HttpServletResponse response,
                Exception ex) throws Exception{
            if(isAjax(request)) {
                //如果是ajax请求,返回json数据
                ModelAndView mav = new ModelAndView(new MappingJackson2JsonView());
                mav.addObject("result", 0);
                mav.addObject("msg", ex.getMessage());
                return mav;
            } else {
                //如果不是ajax请求,跳转到错误页面
                ModelAndView mv = new ModelAndView();
                mv.addObject("exception", ex);
                mv.addObject("url", request.getRequestURL());
                mv.addObject("msg", ex.getMessage());
                if(request.getRequestURL().toString().contains("/m/")) {
                    mv.setViewName("m/error");
                } else {
                    mv.setViewName("error");
                }
                return mv;
            }
        }
        
    }

    spring 部分配置如下:

    <!-- 自动扫描 -->
        <context:component-scan base-package="com.tianwen.dcdp">
            <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
            <context:exclude-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
        </context:component-scan>

    springmvc部分配置如下:

    <context:component-scan base-package="com.tianwen.dcdp.*">
            <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
            <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
        </context:component-scan>

    如此便可实现异常的统一处理

    未完待续

  • 相关阅读:
    Hadoop 最讨厌的报错:运行VirtualBox提示0x00000000错误“0x00000000指令引用的0x00000000内存该内存不能为written?
    linux下面/usr/local和opt目录有何区别
    Hadoop是不是必须在linux上运行?(根本原因是操作系统Linux的权限开放优势)
    Hadoop主要配置文件的作用
    RPC模式
    Hadoop安装最后一步~Hadoop伪分布式配置
    word 使用中遇到的小细节(按空格键后面字不见;从编译器粘贴的代码出现乱码,word标题内容折叠效果实现)
    在VS Code下配置Julia
    使用pandas读取csv文件和写入文件
    ModuleNotFoundError: No module named 'sklearn.cross_validation'
  • 原文地址:https://www.cnblogs.com/yinz/p/9240352.html
Copyright © 2011-2022 走看看