Spring Boot 2 全局异常处理

2023-11-17

1、创建 MyRestControllerAdvice 类,并添加 @RestControllerAdvice
import com.tm.common.dto.Rjson;
import com.tm.common.exception.BusinessException;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.AuthorizationException;
import org.springframework.dao.DataAccessException;
import org.springframework.http.converter.HttpMessageConversionException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 增强器
 * 还有一个 @ControllerAdvice,
 * 他们的区别类似于:@RestController @Controller的区别
 * 如果用:@ControllerAdvice,那么以下发方法,就要加 @ResponseBody 返回数据
 * @author tomao2014@qq.com
 * @date   2018/5/22 21:09
 */
@Slf4j
@RestControllerAdvice
public class MyRestControllerAdvice {

    @ExceptionHandler(RuntimeException.class)
    public Rjson handleRuntimeException(RuntimeException e){
        // http请求异常
        if (e instanceof HttpMessageConversionException){
            log.error("Bad Request",e.getMessage(),e);
            return Rjson.error("Bad Request");
        }
        if (e instanceof AuthorizationException){
            log.error("【无操作权限Shiro",e.getMessage(),e);
            return Rjson.error(Rjson.CODE_1403,"未授权:操作失败,请联系管理员授权");
        }
        if (e instanceof BusinessException){
            log.error("【业务异常】",e.getMessage(),e);
            return Rjson.error(e.getMessage());
        }
        if (e instanceof DataAccessException){
            log.error("【数据库异常:spring-dao",e.getMessage(),e);
            return Rjson.error("DB异常,请联系管理员");
        }
        log.error("【其他RuntimeException",e.getMessage(),e);
        return Rjson.error();
    }


    /** 全局异常捕捉处理 */
    @ExceptionHandler(Exception.class)
    public Rjson handleException(Exception e){
        if (e instanceof  HttpRequestMethodNotSupportedException){
            return Rjson.error("不支持的请求方式/"+e.getMessage());
        }
        log.error("【未知异常】:"+e.getMessage(), e);
        return Rjson.error();
    }
}

2、创建通用,统一的的返回对象
import java.io.Serializable;

/**
 * 通用的返回对象
 * @author tomao2014@qq.com
 * @date   2018/4/13 14:08
 */
public class Rjson implements Serializable{

    /**
     * ajax响应编码,200 表示正常请求,不存在非授权或者未登录请求
     */
    public static final int CODE_DEF = 200;

    /**
     * 未登录,前端判断后,跳转到登录页面
     */
    public static final int CODE_1100 = 1100;

    /**
     * 无权访问
     */
    public static final int CODE_1403 = 1403;

    private Integer code = CODE_DEF;

    private Boolean success = false;

    private String msg;

    private Object obj;

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public Boolean getSuccess() {
        return success;
    }

    public void setSuccess(Boolean success) {
        this.success = success;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Object getObj() {
        return obj;
    }

    public void setObj(Object obj) {
        this.obj = obj;
    }

    public static Rjson error(){
        Rjson r = new Rjson();
        r.setMsg("系统异常,请稍后重试");
        return r;
    }
    public static Rjson error(String msg){
        Rjson r = new Rjson();
        r.setMsg(msg == null ? "系统异常,请稍后重试" : msg);
        return r;
    }
    public static Rjson error(int code,String msg){
        Rjson r = new Rjson();
        r.setCode(code);
        r.setMsg(msg == null ? "系统异常,请稍后重试" : msg);
        return r;
    }
    public static Rjson ok() {
        Rjson r = new Rjson();
        r.setSuccess(true);
        return r;
    }
    public static Rjson ok(String msg) {
        Rjson r = new Rjson();
        r.setSuccess(true);
        r.setMsg(msg);
        return r;
    }
    public static Rjson ok(Object obj) {
        Rjson r = new Rjson();
        r.setSuccess(true);
        r.setObj(obj);
        return r;
    }
    public static Rjson ok(Object obj,String msg) {
        Rjson r = new Rjson();
        r.setSuccess(true);
        r.setObj(obj);
        r.setMsg(msg);
        return r;
    }
}
3、添加完上面的配置之后,我们在controller类中,可以不添加 try...catch... 模块了。
如果出现异常,那么会进入 MyRestControllerAdvice 处理,并返回对应的错误信息。前端页面不会看到
后台直接抛出的异常信息。
import com.baomidou.mybatisplus.mapper.Condition;
import com.tm.auth.entity.SysUser;
import com.tm.auth.service.SysUserService;
import com.tm.common.controller.BaseController;
import com.tm.common.dto.Rjson;
import com.tm.common.validator.ValidatorUtils;
import com.tm.common.validator.group.AddGroup;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * <p>
 *  用户管理
 * </p>
 *
 * @author tomao2014qq.com
 * @since 2018-05-18
 */
@Slf4j
@RestController
@RequestMapping("/sys/user")
public class SysUserController extends BaseController {

    @Autowired
    private SysUserService sysUserService;

    @PostMapping("/add")
    public Rjson add(@RequestBody SysUser user){
        ValidatorUtils.validateEntity(user,AddGroup.class);
        sysUserService.add(user);
        return Rjson.ok();
    }
}
如果在controller类中添加了 try...catch... 如果处理过程中,出现异常,那么返回的是 controller
中我们指定catch中的信息。
@PostMapping("/add")
public Rjson add(@RequestBody SysUser user){
    try {
        ValidatorUtils.validateEntity(user,AddGroup.class);
        sysUserService.add(user);
    }catch (Exception e){
        return Rjson.error("返回的异常信息,是我!");
    }
    return Rjson.ok();
}
 

参考资料:

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

https://www.cnblogs.com/nosqlcoco/p/5562107.html

https://blog.csdn.net/flygoa/article/details/75284755


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot 2 全局异常处理 的相关文章

  • 用vue3+elementplus做的一个滚动菜单栏的组件

    目录 起因 概览 设计及解决思路 1 滚动条竖起来 2 绑定菜单 3 吸附 优化 组件全部代码 起因 在elementplus中看到了滚动条绑定了slider 但是这个感觉很不实用 在底部 而且横向滚动 最常见的应该是那种固定在左上角的带着
  • 交叉编译适配mips架构的GDB

    交叉编译GDB 交叉编译GDB 1 下载GDB源码 2 解压并创建安装目录 3 编译安装 4 可能遇到的错误解决方法 1 下载termcap 2 将上面的编译安装gdb的脚本改一下 3 对于最后的权限不够无法删除PC机上termcap h文
  • 使用UE4(UnrealEngine)创建工程

    UE4系列文章目录 文章目录 UE4系列文章目录 前言 一 步骤 1 打开UE4软件 2 新建工程 3 选择游戏类型模板 4 项目设置 运行游戏 前言 使用UE4 UnrealEngine 创建工程 我这里的ue4版本是4 27 2 一 步
  • stm32循迹小车详细制作过程(附加完全版代码)

    stm32循迹小车详细制作过程 一 材料准备 1 主控板 Stm32f103c8t6 推荐 便宜够用 2 下载器 USB转TTL串口模块 3 电源 12v锂电池组 配套充电器 推荐下图这种 方便 好接线 12v 12v 12v 4 电机驱动
  • No module named ‘dateutil‘解决

    运行程序报错 无法直接pip install dateutil 需要pip install python dateutil
  • [非线性控制理论]6_滑模控制 (sliding mode control)

    非线性控制理论 1 Lyapunov直接方法 非线性控制理论 2 不变性原理 非线性控制理论 3 基础反馈稳定控制器设计 非线性控制理论 4 反馈线性化 反步法 非线性控制理论 5 自适应控制器 Adaptive controller 非线
  • CF 935E - Fafa and Ancient Mathematics

    CF 935E Fafa and Ancient Mathematics 题目描述 定义合法数学表达式 E E E 为一个数或两个合法数学表达式中间加上一个加或减运算符 并且在外面加上一对括号 给定一个合法数学表达式 将其中加减运算符用
  • QML Image内部缓存导致的问题

    QML Image BUG BUG描述 两个界面login qml 和 modify qml 页面 内部代码大致如下 Camera id camera imageProcessing whiteBalanceMode CameraImage
  • python实现vlookup_干货一:怎么在python里面实现vlookup

    vlookup应该是excel里用的比较多的功能 我刚接触excel的时候 反正觉得这个功能非常神奇 省了很多事 但是用久了以后就发现vlookup的限制太多了 第一大痛点 只能往右边 gt 找 如果要往左边找 最笨的办法就是把要找的col
  • rpm软件包解读

    一 linux应用程序与系统命令关系 二 典型应用程序的目录结构 三 常见的软件包封装类型 RPM包管理工具 RPM软件包管理器RED HAT PACKAGE MANAGER 由Red Hat公司提出 被众多linux发行版所采用 建立统一
  • 【机器学习】Q-Learning详细介绍

    Q learning Q learning 是一种机器学习方法 它使模型能够通过采取正确的操作来迭代学习和改进 Q learning属于强化学习的算法 通过强化学习 可以训练机器学习模型来模仿动物或儿童的学习方式 好的行为会得到奖励或加强
  • 如何从几何角度上理解方程组只有一个解_线性方程组的解集及其几何意义

    由于这三者之间的等价关系 我们解决现实问题时可以自由选取其中任意一个作为模型 我个人认为 线性方程组是最 质朴 的形式 向量方程则是与几何建立了关系 这将方便我们进行更直观的推理 矩阵方程则是向量方程的一种 封装 是向量方程的一种抽象 它将
  • Hotspot 垃圾回收之ConcurrentMarkSweepThread 源码解析

    目录 一 ConcurrentGCThread 二 SurrogateLockerThread 1 make 2 loop manipulatePLL 三 ConcurrentMarkSweepThread 1 定义 2 start和构造方
  • 微服务系列(六) 服务熔断与服务降级

    一 背景 分布式系统环境下 服务间类似依赖非常常见 一个业务调用通常依赖多个基础服务 如下图 对于同步调用 当库存服务不可用时 商品服务请求线程被阻塞 当有大批量请求调用库存服务时 最终可能导致整个商品服务资源耗尽 无法继续对外提供服务 并
  • element-ui表格列el-table-column如何根据数据不同显示不同的值,获取prop值

    方法一 格式化数据 在使用element ui的表格时 有时候后台给你的字段和你要显示在表格列里的内容不一致 例如后台给的字段是state 它的值为true或false 要求显示在表格里是 正确 或 错误 这时可以给el table col
  • FreeRTOS轻量级同步--任务通知

    1 简介 在FreeRTOS的配置参数中的configUSE TASK NOTIFICATIONS宏打开 一般RTOS会默认打开 如图1所示 图1 notify宏开关 RTOS在创建任务时 会创建一个32位的通知值ulNotifiedVal
  • C#中await Task.Run 返回值

    using System using System Text using System Collections Generic using System Threading using System Threading Tasks name
  • Cadence Allegro PCB设计88问解析(十一) 之 Allegro中文件自动保存时间设置

    一个学习信号完整性的layout工程师 大家在设计图纸或者编辑文档时 最常点击的应该就是保存图标了 谁也不想因为软件闪退 电脑断电等情况 我们的劳动成果就白白的消失了 在我们用Allegro进行PCB设计 就会有一个自动保存的功能 每隔一段
  • 一文看懂L1、L2正则化的区别

    正则化是一种为了减小测试误差的行为 有时候会增加训练误差 我们在构造机器学习模型时 最终目的是让模型在面对新数据的时候 可以有很好的表现 当你用比较复杂的模型比如神经网络 去拟合数据时 很容易出现过拟合现象 训练集表现很好 测试集表现较差
  • 牛顿迭代法求解二元非线性方程组,C++代码实现

    整体迭代公式就是 上式中 为的雅克比矩阵 为雅克比矩阵的逆矩阵 实例 求解的x和y的解 上面求根问题可转化为的问题 即可用牛顿迭代法求解此二元非线性方程 具体求解过程代码如下所示 线性方程组中方程个数 未知量个数 include

随机推荐

  • 推荐书目

    深入理解计算机系统 原书第2版 作 者 美 Randal E Bryant David R O Hallaron 著 出 版 社 机械工业出版社 图书定价 99 00 准备看看 C C 从入门到高手所有必备PDF书籍收藏 喜欢的朋友支持下吧
  • 经典的python基础练习

    假设市面上有4种面值 硬币 20元 10元 5元 1元 输入一个钱数 能够使用最少的硬币凑成这个钱数 def mon money ss 0 0 0 0 coinKinds 20 10 5 1 for i in range len coinK
  • 代码覆盖率与测试覆盖率你选哪个?

    目录 一 概念 二 代码覆盖率 三 为什么要执行代码覆盖率 四 如何执行代码覆盖率 五 代码覆盖率工具 六 测试覆盖率 七 如何执行测试覆盖率 八 测试覆盖率工具 九 代码覆盖率与测试覆盖率 哪一个 十 测试覆盖范围的优势 十一 测试覆盖范
  • 2017年全国数学建模国赛B题题目、解题思路、matlab代码(三)

    题目 移动互联网的迅速发展使得任务完成新模式 众包 的实现成为可能 这种自助式服务模式以移动互联网为劳务众包平台 通过线上 APP 建立起需要商业检查和信息搜集的企业与可以完成规定任务的大众之间的联系 从而大大节省企业调查成本 有效地保证调
  • 设计模式读书笔记

    希望通过记录一些关键点做到实际开发中能够得心应手 目录 状态模式 策略模式 观察者模式 装饰者模式 适配器模式 外观模式 抽象工厂模式 工厂方法模式 单例模式 命令模式 模板方法模式 迭代器模式 组合模式 代理模式 建造者模式 桥接 Bri
  • c语言,通讯录

    目录 test c contact h contact c 我们先创建三个不同的文件 分别是主体函数test c 函数实现contact c 和头文件contact h test c 制作一个简单的目录即可 记得包含头文件 include
  • tensorflow人脸识别_「深度学习」用TensorFlow实现人脸识别(附源码,快速get技能)...

    本文将会带你使用python码一个卷积神经网络模型 实现人脸识别 操作难度比较低 动手跟着做吧 让你的电脑认出你那帅气的脸 由于代码篇幅较长 而且最重要的缩进都没了 建议直接打开源码或者点击分享 gt 复制链接 然后到浏览器里观看 执行顺序
  • qt之CheckBox选中与未选中的使用

    引言 给大家推荐一个超好用的软件 此软件也是优秀博主开发 主要是针对在我们开发过程中会不断的收集资料 而经过时间的洗礼 这些资料慢慢变得庞大起来 但是就出现了个问题 你2年前收集的资料 你在某天打开发现只有一个文件名 根本不知道具体里面干了
  • Ubuntu 16.04切换Intel集显为Nvidia独显教程

    在安装完Ubuntu后 会出现屏幕显示不正常 这时候可能是没有用到NVIDIA的独显 而是用的intel的集成显卡 一 检查 由于之前集成显卡的时候没有截图 大致下图上图形为llvmpipe LLVM 6 0 256 bits 的信息 没有
  • 17个面向Web 开发人员的杀手级网站,值得你收藏

    保持网站方便可能是最终的生产力技巧 以下是我用来让我的生活更轻松的一些最好的网站 让我们一起来看看它们 1 图片API 地址 https source unsplash com 世界上最强大的照片引擎 Unsplash API 是一种现代
  • 解题思路-LeetCode第55题:跳跃游戏

    解题思路 LeetCode第55题 跳跃游戏 题目描述 给定一个非负整数数组 你最初位于数组的第一个位置 数组中的每个元素代表你在该位置可以跳跃的最大长度 判断你是否能够到达最后一个位置 示例 1 输入 2 3 1 1 4 输出 true
  • 数值类型转换Number()、parseInt()、parseFloat()

    在开发中踩了一个坑 在进行两个字符串类型的值比较时 忘记转换成数值类型导致错误 所以借此正好整理下数值类型转换的几种方式的比较与区分 Number parseInt parseFloat 的比较区分 Number 1 如果传入的是数值类型
  • 毕业五年,从月薪3K到年薪50W+,需要掌握哪些核心技能?(c/c++研发岗)

    作为一个程序员 随着工作年限的不断增长 感觉自己的技术水平与自己的工作年限严重不符 想跳槽出去换个新环境吧 又感觉自己的能力达不到心仪公司的标准 即使投了简历也没人来通知自己面试 就这样在原来的公司一天天的混日子 时间久了 感觉自己废了 就
  • 微信小程序怎么改变默认的打开页面?

    刚开始接触微信小程序 本来想要打开一个新页面而不是用原来的 这个页面 每次编译之后怎么才能让默认打开的页面不是这个页面而是我指定的页面呢 就去找到app json 把想指定的页面放到第一个 那么默认打开的首页就是你指定的页面了 这是来源于官
  • 两行Python代码调整视频的亮度

    老猿Python博文目录 一 引言 最近看到好几篇类似 n行Python代码 的博文 看起来还挺不错 简洁 实用 传播了知识 带来了阅读量 撩动了老猿的心 决定跟风一把 推一个 n行Python代码系列 文章 对于视频中的画面 有时出于特定
  • 【VPR】 Command-line - vpr的命令行选项(一)

    目录 一 基本用法 二 命令行详解 2 1 阶段选项 Stage Options 2 2 图形选项 Graphics Options 2 3 常规选项 General Options 2 4 文件名选项 Filename Options 2
  • RuntimeError: Attempting to deserialize object on a CUDA device but torch.cuda.is_available() is F..

    今天在HPC上跑的方法疯狂报错 RuntimeError Attempting to deserialize object on a CUDA device but torch cuda is available is False If y
  • System.IO.IOException: Sharing violation on pat

    System IO IOException Sharing violation on path E wang downloadmanage Assets download IEM2 apk at System IO FileStream c
  • 浅谈机器学习-回归与分类的区别

    前言 机器学习的主要任务便是聚焦于两个问题 分类和回归 本文将浅谈下两者的区别 区别 回归会给出一个具体的结果 例如房价的数据 根据位置 周边 配套等等这些维度 给出一个房价的预测 分类相信大家都不会陌生 生活中会见到很多的应用 比如垃圾邮
  • Spring Boot 2 全局异常处理

    1 创建 MyRestControllerAdvice 类 并添加 RestControllerAdvice import com tm common dto Rjson import com tm common exception Bus