SpringBoot 2 快速整合 | 统一异常处理
统一异常处理相关注解介绍
@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个方法 :
- 成功处理含实体数据
- 成功处理 没有实体数据
- 失败处理
具体代码如下:
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 快速整合 | 统一异常处理的更多相关文章
- 使用Springboot + Gradle快速整合Mybatis-Plus
使用Springboot + Gradle快速整合Mybatis-Plus 作者:Stanley 罗昊 [转载请注明出处和署名,谢谢!] MyBatis-Plus(简称 MP)是一个 MyBatis ...
- SpringBoot小技巧:统一异常处理
SpringBoot小技巧:统一异常处理 情景描述 对于接口的定义,我们通常会有一个固定的格式,比如: 但是调用方在请求我们的API时把接口地址写错了,就会得到一个404错误,且不同于我们定义的数据格 ...
- 玩转 SpringBoot 2 快速整合 | JSP 篇
前言 JavaServer Pages(JSP)技术使Web开发人员和设计人员能够快速开发和轻松维护利用现有业务系统的信息丰富的动态Web页面. 作为Java技术系列的一部分,JSP技术可以快速开发独 ...
- springBoot数据校验与统一异常处理
概念 异常,在程序中经常发生,如果发生异常怎样给用户一个良好的反馈体验就是我们需要处理的问题.以前处理异常信息,经常都是给前端一个统一的响应,如数据错误,程序崩溃等等.没办法指出哪里出错了,这是一种对 ...
- 玩转 SpringBoot 2 快速整合 | 丝袜哥(Swagger)
概述 首先让我引用 Swagger 官方的介绍: Design is the foundation of your API development. Swagger makes API design ...
- 玩转 SpringBoot 2 快速整合拦截器
概述 首先声明一下,这里所说的拦截器是 SpringMVC 的拦截器 HandlerInterceptor.使用SpringMVC 拦截器需要做如下操作: 创建拦截器类需要实现 HandlerInte ...
- 玩转 SpringBoot 2 快速整合 Filter
概述 SpringBoot 中没有 web.xml, 我们无法按照原来的方式在 web.xml 中配置 Filter .但是我们可以通过 JavaConfig(@Configuration +@Bea ...
- 玩转 SpringBoot 2 快速整合 | FreeMarker篇
FreeMarker 介绍 Apache FreeMarker™是一个模板引擎:一个Java库,用于根据模板和更改数据生成文本输出(HTML网页,电子邮件,配置文件,源代码等).模板是用FreeMar ...
- 玩转 SpringBoot 2 快速整合 | Thymeleaf 篇
前言 Thymeleaf是一个适用于Web和独立环境的现代服务器端Java模板引擎. Thymeleaf的主要目标是为您的开发工作流程带来优雅的自然模板 - 可以在浏览器中正确显示的HTML,也可以用 ...
随机推荐
- halcon视频教程如何学习?怎么样才能踏入机器视觉这个行业?
本人是工作八年的视觉工程师,主要从事Halcon和Visionpro视觉开发,谈谈个人对视觉学习看法: 1.HALCON是德国MVtec公司开发的一套完善的标准的机器视觉算法包,它节约了产品成本,缩短 ...
- solidity的delete操作汇总
简介 Solidity中的特殊操作符delete用于释放空间,为鼓励主动对空间的回收,释放空间将会返还一些gas. delete操作符可以用于任何变量,将其设置成默认值0. 删除枚举类型时,会将其值重 ...
- vuex的实现
源代码可以查看我的github: https://github.com/Jasonwang911/TryHardEveryDay/tree/master/Vuex/vuex-resouce 欢迎s ...
- Nginx 的简单使用 (IIS,Asp.Net)
Nginx 的一些常见功能(windows,AspNet ,IIS) 下载 官方网站:https://nginx.org/en/download.html 下载,解压缩是这个样子 启动: 启动方式有两 ...
- Java连载10-数据类型取值范围&转义字符
一.数据类型取值范围 二.八种数据类型在成员变量中的默认值 (1)成员变量,没有赋值,编译不会报错,系统会自动给赋值 byte\int\short\long默认值为0:float\double默认值为 ...
- 【转载】【VSCode】Windows下VSCode编译调试c/c++
转载自:http://blog.csdn.net/c_duoduo/article/details/51615381 懒得自己配置或自己配置出现不明问题的朋友可以点这里: [VSCode]Window ...
- Leetcode的SQL题解:185. 部门工资前三高的员工
题目 查询部门工资前三高的员工. 我用的数据库是oracle. 下面是数据表的信息. Employee表数据: | ID | NAME | Salary | DepartmentId | | -- | ...
- Kafka基本知识入门(一)
1. 基础知识 有关RabbitMQ,RocketMQ,Kafka的区别这个网上很多,了解一下区别性能,分清什么场景使用.分布式环境下的消息中间件Kafka做的比较不错,在分布式环境下使用频繁,我也不 ...
- 2019最新最全Java开发面试常见问题答案总结
2019最新最全Java开发面试常见问题答案总结 马上准备9月份出去面试Java开发,自己学习丢西瓜捡芝麻,学了的都忘了,所以有机会自己做个学习笔记,摘录自各个博文以及总结. 1.JAVA面向对象的特 ...
- js实现图片上传方法
知识点 onchange事件 循环 封装函数 ajax php Javascript代码 //找到元素 var file=document.getElementById("file" ...