• 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>

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

    未完待续

  • 相关阅读:
    c++动态数组
    通俗理解ac,ap,路由器的区别(很好懂)
    java连接pg数据库
    分享:更好地理解c++类,多文件导入等
    安装WinPcap等软件出现关于npf.sys的错误
    【开源】EP3C25Q240扩展板1
    UML——用例图
    Git常用命令
    聊聊新特性操作符 ! / ? / ??
    精通 Nginx 扒书记录
  • 原文地址:https://www.cnblogs.com/yinz/p/9240352.html
Copyright © 2020-2023  润新知