统一异常处理相关注解介绍

  • @ControllerAdvice

    声明在类上用于指定该类为控制增强器类,如果想声明返回的结果为 RESTFull 风格的数据,需要在声明 @ExceptionHandler 注解的方法上同时加
    @ResponseBody

  • @RestControllerAdvice

    声明在类上用于指定该类为控制增强器类。并声明返回的结果为 RESTFull 风格的数据,无需在声明**@ExceptionHandler**注解的方法上加
    @ResponseBody

  • @ExceptionHandler

    声明在方法上用于指定需要统一拦截的异常。例如:@ExceptionHandler(value = Exception.class)

实战操作

定义消息类:

定义 RESTFull 返回 JSON 数据的消息类,其中包含成员变量如下:

  • code:错误码,0表示没有异常信息。
  • message:异常提示信息。
  • date:无异常是返回具体内容信息。
public class ReturnMessage<T> {private Integer code;//错误码private String message;//提示信息private T date;//返回具体内容public ReturnMessage(Integer code, String message, T date) {super();this.code = code;this.message = message;this.date = date;}//省略get and set方法}

消息类处理工具类

主要是用来处理成功或失败消息处理,该工具类主要包含是3个方法 :

  1. 成功处理含实体数据
  2. 成功处理 没有实体数据
  3. 失败处理

具体代码如下:

public class ReturnMessageUtil {/*** 无异常 请求成功并有具体内容返回* @param object* @return*/public static ReturnMessage<Object> sucess(Object object) {ReturnMessage<Object> message = new ReturnMessage<Object>(0,"sucess",object);return message;}/*** 无异常 请求成功并无具体内容返回* @return*/public static ReturnMessage<Object> sucess() {ReturnMessage<Object> message = new ReturnMessage<Object>(0,"sucess",null);return message;}/*** 有自定义错误异常信息* @param code* @param msg* @return*/public static ReturnMessage<Object> error(Integer code,String msg) {ReturnMessage<Object> message = new ReturnMessage<Object>(code,msg,null);return message;}}

自定义异常类:

我们通过自定义系统异常类来完成校验相关的操作,自定义系统异常类通过继承 RuntimeException ,然后声明名称为 code 的成员变量来表示不同类型异常。

主要是用于异常拦截后获取自定义异常的 code ,并将code 设置到消息类中。

public class SbException extends RuntimeException{private Integer code;public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public SbException(Integer code,String message) {super(message);this.code = code;}}

定义统一异常拦截类:

通过声明 @RestControllerAdvice 表示该类为 RESTFul 风格的异常处理控制增强器类,在 handle 方法声明 @ExceptionHandler 并在该注解中指定要拦截的异常类。具体代码如下:

@RestControllerAdvice
public class ExceptionHandle {private final static Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);@ExceptionHandler(value = Exception.class)public ReturnMessage<Object> handle(Exception exception) {if(exception instanceof SbException) {SbException sbexception = (SbException)exception;return ReturnMessageUtil.error(sbexception.getCode(), sbexception.getMessage());}else {logger.error("系统异常 {}",exception);return ReturnMessageUtil.error(-1, "未知异常"+exception.getMessage());}}
}

测试

分别测试自定义异常和系统异常,通过 /error/custome 测试自定义异常,通过 /error/unknown 测试未知的系统异常。具体代码如下:

@RestController
@RequestMapping("/error")
public class DemoException {@GetMapping(value = "custome")public void customException() {SbException sbe = new SbException(100, "这个是自定义异常!");throw sbe;}@GetMapping(value = "unknown")public void unknownException() {int i = 0;int b = 1/i;}
}

测试结果:

SpringBoot 2 快速整合 | 统一异常处理相关推荐

  1. 玩转 SpringBoot 2 快速整合 | RESTful Api 篇

    概述 RESTful 是一种架构风格,任何符合 RESTful 风格的架构,我们都可以称之为 RESTful 架构.我们常说的 RESTful Api 是符合 RESTful 原则和约束的 HTTP ...

  2. SpringBoot 2 快速整合 RabbitMQ

    前言 本文介绍了通过最简单方法使用 SpringBoot 2 整合 RabbitMQ,带你快速上手 RabbitMQ 的操作. 操作前需要先安装 RabbitMQ 服务.Windows 系统可以参考 ...

  3. 玩转 SpringBoot 2 快速整合 | JSP 篇

    前言 JavaServer Pages(JSP)技术使Web开发人员和设计人员能够快速开发和轻松维护利用现有业务系统的信息丰富的动态Web页面.作为Java技术系列的一部分,JSP技术可以快速开发独立 ...

  4. 玩转 SpringBoot 2 快速整合 Filter 注解版

    前言 本文主要介绍如何在SpringBoot 2 中使用 Filter 的快速搭建教程,阅读前需要你必须了解 Filter 的基础使用以及如何搭建 SpringBoot 项目. 快速演示操作 第一步: ...

  5. 玩转 SpringBoot 2 快速整合 Listener

    前言 本文主要介绍如何在SpringBoot 2 中使用 Listener 的快速搭建教程,阅读前需要你必须了解 Listener 的基础使用以及如何搭建 SpringBoot 项目. 快速演示操作 ...

  6. 玩转 SpringBoot 2 快速整合 Servlet

    前言 本文主要介绍如何在SpringBoot 2 中使用 Servlet 的快速搭建教程,阅读前需要你必须了解 Servlet 的基础使用以及如何搭建 SpringBoot 项目. 快速演示操作 第一 ...

  7. springboot实现快速整合mybatis+mysql

    springboot如今火爆的程度大有将传统的ssm比下去的势头,究其原因,还是springboot被越来越多的公司使用,其简洁的配置,优秀的封装性,便捷的全注解开发,同时由于和越来越多的其他框架进行 ...

  8. 玩转 SpringBoot 2 快速整合拦截器

    概述 首先声明一下,这里所说的拦截器是 SpringMVC 的拦截器(HandlerInterceptor).使用SpringMVC 拦截器需要做如下操作: 创建拦截器类需要实现 HandlerInt ...

  9. 玩转 SpringBoot 2 快速整合 | 丝袜哥(Swagger)

    概述 首先让我引用 Swagger 官方的介绍: Design is the foundation of your API development. Swagger makes API design ...

最新文章

  1. Altium Designer飞线(未连接线)不显示的解决方法
  2. linux系统中使用oracle透明网关连接db2数据库,Linux系统中使用Oracle透明网关连接DB2数据库...
  3. 前端学习(2364):图片的上传
  4. 1000行MySQL学习笔记,人手一份,建议收藏!
  5. 在线的代码托管平台 coding.net ===中国扩展版github
  6. Oracle数据脱敏REPLACE()和SUBSTR()
  7. s7scan 安装使用教程
  8. 信必优成功案例 – 中国网络电视台(CNTV)
  9. Android开发常见问题汇总
  10. Electron无边框模式下禁止双击最大化窗口
  11. android获取应用内自定义权限与权限使用情况
  12. 塞林格《麦田里的守望者》读后感
  13. 【教程】手机远程连接另一台手机的termux进行拍照
  14. wps word文档生成目录的时候显示断裂会生成大纲怎么办_如何用Word编辑参考文献...
  15. Paper笔记: 《LaVAN: Localized and Visible Adversarial Noise》
  16. FreeBSD网站平台建设全过程(一、系统安装)
  17. java中这些判断空的用法,太优雅了
  18. [词根词缀]leg/lega/lev/liber/lig词根由来
  19. Apm飞控学习笔记之添加我的设备或单片机串口通信-Cxm
  20. 鸿蒙升级体验版,升级鸿蒙2.0公测版体验,没有安卓系统的碎片化,比ios更流畅...

热门文章

  1. linux 游戏 黑白,黑白迭代官方版游戏-黑白迭代下载v0.5-Linux公社
  2. Pyqt5:使用多线程QThread
  3. java excel自动保存_比POI好用的EasyExcel简单使用记录
  4. OpenShift 4 - DevSecOps (3) - 用 RHACS 精细化管理云原生应用安全
  5. 通过数据扩充来扩展数据集
  6. C#坏习惯:通过不好的例子学习如何制作好的代码——第3部分
  7. Odoo10参考系列--工作流
  8. python minimize_【趣味案例】用Python来做一个屏幕录制工具
  9. git 查看pop内容_原创 | 有了Git这个操作,我再也不怕代码混乱了!
  10. mysql workbench 存储过程_MySQL Workbench创建存储过程教程示例