当前位置: 首页 > news >正文

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

==>如有问题,请联系我:easonjim#163.com,或者下方发表评论。<==

相关文章:

  • 【移动端兼容【移动端兼容问题研究】javascript事件机制详解(涉及移动兼容)研究】javascript事件机制详解(涉及移动兼容)...
  • 基于Jquery UI的autocompelet改写,自动补全控件,增加下拉选项,动态设置样式,点击显示所有选项,并兼容ie6+...
  • 第94天:CSS3 盒模型详解
  • 56.随机产生的id重复问题
  • MS SQL SERVER中的临时表
  • ExtJS 4.2 教程-03:使用Ext.define自定义类
  • 千古奇闻!明朝就已成功试爆两万吨原子弹?
  • C#和sqlserver中生成新的32位GUID
  • linux下安装oracle11g
  • 将文件加入到图形文件里;
  • Eclipse中已安装的插件如何卸载
  • Linux实现vnc管理
  • Redis的复制流程
  • 批处理 去掉变量空格
  • xshell及secureCRT保存日志
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • android图片蒙层
  • CentOS7 安装JDK
  • KMP算法及优化
  • linux学习笔记
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • python_bomb----数据类型总结
  • react-native 安卓真机环境搭建
  • Solarized Scheme
  • Spring Boot快速入门(一):Hello Spring Boot
  • Zepto.js源码学习之二
  • 阿里云Kubernetes容器服务上体验Knative
  • 大数据与云计算学习:数据分析(二)
  • 聊聊sentinel的DegradeSlot
  • 前端工程化(Gulp、Webpack)-webpack
  • 驱动程序原理
  • 数据科学 第 3 章 11 字符串处理
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 异步
  • 译米田引理
  • 原生js练习题---第五课
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • #define 用法
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (c语言)strcpy函数用法
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (转)菜鸟学数据库(三)——存储过程
  • **python多态
  • .bat批处理(六):替换字符串中匹配的子串
  • .Mobi域名介绍
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)