• Spring MVC中@ControllerAdvice注解实现全局异常拦截


    在网上很多都把Advice翻译成增强器,其实从翻译工具上看到,这个单词翻译是忠告,通知的意思。

    首先这个注解实在Spring Web包下,而Spring MVC离不开Spring Web的依赖,所以经常两个一起使用的。

    题外:如果在asp.net webform下可以做这样的事情有两处地方,全部集成Base或者Globals去拦截,而在asp.net webmvc下提供了指定类进行注入,Globals同样也有,并且可以实现,但提倡这个,mvc已经有了新的类实现全局,以上是dotnet的等等。

    @ControllerAdvice的做可以可以全局拦截指定的异常,并做想要的包装处理,比如跳转到别的页面,或者返回指定的数据格式等等。

    下面是通过这个特定实现的简单拦截:

    1、新建MyControllerAdvice类

    package com.jsoft.springboottest.springboottest1.controller;
    
    import org.springframework.ui.Model;
    import org.springframework.web.bind.WebDataBinder;
    import org.springframework.web.bind.annotation.*;
    import org.springframework.web.context.request.NativeWebRequest;
    
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * Controller增强器
     *
     * @author jim
     * @date 2017/11/23
     */
    @ControllerAdvice
    public class MyControllerAdvice {
    
        @ModelAttribute
        public void changeModel(Model model) {
            System.out.println("============应用到所有@RequestMapping注解方法,在其执行之前把返回值放入Model");
            model.addAttribute("author", "Jim");
        }
    
        @InitBinder
        public void initBinder(WebDataBinder binder) {
            System.out.println("============应用到所有@RequestMapping注解方法,在其执行之前初始化数据绑定器");
        }
    
    
        /**
         * 设置要捕获的异常,并作出处理
         * 注意:这里可以返回试图,也可以放回JSON,这里就当做一个Controller使用
         *
         * @param request {@link NativeWebRequest}
         * @param e {@link Exception}
         * @return {@link Map}
         */
        @ExceptionHandler(value = Exception.class)
        @ResponseBody
        public Map processUnauthenticatedException(NativeWebRequest request, Exception e) {
            System.out.println("===========应用到所有@RequestMapping注解的方法,在其抛出Exception异常时执行");
            Map map = new HashMap(5);
            map.put("code", 404);
            map.put("msg", e.getMessage());
            return map;
        }
    }

    2、测试异常,模拟抛出异常

        @RequestMapping("/show")
        public String show() throws Exception {
            throw new Exception("测试异常");
        }

    测试效果:

    测试工程:https://github.com/easonjim/5_java_example/tree/master/springboottest/springboottest9

    参考:

    http://jinnianshilongnian.iteye.com/blog/1866350

    https://www.cnblogs.com/magicalSam/p/7198420.html

  • 相关阅读:
    转:测试驱动开发全攻略
    转:如何提高自己的归纳总结能力?
    转:从编译链接过程解析static函数的用法
    C++ 不能在类体外指定关键字static
    转:画图解释 SQL join 语句
    转:[置顶] 从头到尾彻底理解KMP(2014年8月22日版)
    转:The Knuth-Morris-Pratt Algorithm in my own words
    转:数组与指针的区别
    删除单链表中间节点
    如果判断两个单链表有交?第一个交点在哪里?
  • 原文地址:https://www.cnblogs.com/EasonJim/p/7887646.html
Copyright © 2020-2023  润新知