Spring/SpringBoot定义统一异常错误码返回
配置
大致说下流程,
首先我们自定义一个自己的异常类CustomException,继承RuntimeException。再写一个异常管理类ExceptionManager,用来抛出自定义的异常。
然后使用Spring提供的注解@RestControllerAdvice或者@ControllerAdvice写一个统一异常处理的类,在这个类中写一个带有@ExceptionHandler(Exception.class)注解的方法,这个方法会接收到所有抛出的异常,在方法内部我们就可以写自己的异常处理逻辑。
如果参数是CustomException类型,我们就自定义返回体,返回异常字典的错误信息。如果是其它类型的异常就返回系统异常。
话不多说,上代码。
一、自定义的异常类
@Data
@NoArgsConstructor
public class CustomException extends RuntimeException { public CustomException(String code, String msg) {
super(code);
this.code = code;
this.msg = msg;
} private String code; private String msg; }
二、异常管理类
@Component
public class ExceptionManager { @Resource
Environment environment; public CustomException create(String code) {
return new CustomException(code, environment.getProperty(code));
} }
Environment是spring的环境类,会包含所有properties文件的键值对。
三、异常字典 exception.properties
# sso异常测试
EC00001=SSO的WEB层错误
需要加载到spring的环境中,我是用配置类加载的,方式如下:
@Component
@PropertySource(value = {"exception.properties"}, encoding = "UTF-8")
public class LoadProperty { }
四、全局异常捕捉类
@RestControllerAdvice
public class GlobalExceptionHandler { @ExceptionHandler(Exception.class)
public ApiResult handlerException(Exception e) { //如果是自定义的异常,返回对应的错误信息
if (e instanceof CustomException) {
e.printStackTrace();
CustomException exception = (CustomException) e;
return ApiResult.error(exception.getCode(), exception.getMsg());
} else {
//如果不是已知异常,返回系统异常
e.printStackTrace();
return ApiResult.error("SYS_EXCEPTION", "系统异常");
} } }
ApiResult是我处定义的接口json返回,代码也一并贴上.
//ApiResult
/**
* @author kingboy--KingBoyWorld@163.com
* @date 2017/7/23 下午7:19
* @desc 返回体.
*/
@Data
public abstract class ApiResult { protected String code; /**
* 成功的返回
* @param data 数据
* @return 正常返回体
*/
public static ApiResult success(Object data) {
return new SuccessApiResult(data);
} /**
* 错误返回
* @param errorCode 错误码
* @param errorMessage 错误信息
* @return 错误返回体
*/
public static ApiResult error(String errorCode, String errorMessage) {
return new ErrorApiResult(errorCode, errorMessage);
} }
//SuccessApiResult
@Data
public class SuccessApiResult extends ApiResult { private Object data; SuccessApiResult(Object data) {
this.code = "0";
this.data = data;
} }
//ErrorApiResult
@Data
public class ErrorApiResult extends ApiResult { private String msg; ErrorApiResult(String code, String msg) {
this.code = code;
this.msg = msg;
}
}
使用示例
/**
* @author kingboy--KingBoyWorld@163.com
* @date 2017/8/1 下午5:57
* @desc 异常测试.
*/
@RestController
@RequestMapping("/exception")
public class ExceptionController { @Resource
ExceptionManager exceptionManager; @RequestMapping("/controller")
public String exceptionInController() {
if (true) {
throw exceptionManager.create("EC00001");
}
return "controller exception!";
} }
返回信息如下:
{
"code": "EC00001",
"msg": "SSO的WEB层错误"
}
Spring/SpringBoot定义统一异常错误码返回的更多相关文章
- AgileBoot - 项目内统一的错误码设计
本篇文章主要探讨关于统一错误码的设计,并提供笔者的实现 欢迎大家讨论,指正. 该错误码的设计在仓库: github:https://github.com/valarchie/AgileBoot-Bac ...
- JavaWeb项目中获取对Oracle操作时抛出的异常错误码
最近在项目中碰到了这么一个需求,一个JavaWeb项目,数据库用的是Oracle.业务上有一个对一张表的操作功能,当时设置了两个字段联合的唯一约束.由于前断没有对重复字段的校验,需要在插入时如果碰到唯 ...
- Redis Windows 服务启动异常 错误码1067
https://blog.csdn.net/after_you/article/details/62215163 Redis Windows 服务启动异常 错误码1067 下载了Redis 2.8.2 ...
- 自己写的驱动用CreateFile打开时错误码返回1的问题
就像题目上说的,今天在写一个例子代码时遇到了这个问题,下面是当时驱动层和应用层的代码: #include <ntddk.h> #define BASE_CODE 0x800 #define ...
- (三)SpringBoot定义统一返回result对象
一:定义响应码枚举 package com.example.demo.core.ret; /** * @Description: 响应码枚举,参考HTTP状态码的语义 * @author * @dat ...
- MySQL 异常错误码使用 及 对照表
DECLARE CONTINUE HANDLER FOR SQLWARNING, SQLEXCEPTION, NOT FOUND BEGIN GET DIAGNOSTICS CONDITION cod ...
- 彻底解决ASP.NET MVC 3 404错误码返回302的问题
转自:http://blog.csdn.net/mycloudke/article/details/9746333 404状态码:,意味着当在页面上显示用户点击不存在,提高用户体验度,搜索引擎会放弃这 ...
- springboot创建统一异常拦截器全局处理 异常
1.创建Exception类 public class MyException extends RuntimeException { private ErrorCodeEnum errorCode; ...
- Spring MVC怎么统一异常管理?
1. 在类上加上@ControllerAdvice注解 2. 在方法上加上@ExceptionHandler注解 @ExceptionHandler(Exception.class) @Respons ...
随机推荐
- [UE4]控件模板参数
创建的时候就会变成这样了.
- js浮点数运算封装, 起因财务部分精确计算
目录 背景 具体代码 背景 项目中用到浮点数,Int 等 js中 Number类型比较多, 加上牵涉到财务软件, 前台js运算等. 有时候会出现精确度的问题 , 公共方法中有好事者写的方法. 此处拿来 ...
- 第11章 拾遗1:网络地址转换(NAT)和端口映射
1. 网络地址转换(NAT) 1.1 NAT的应用场景 (1)应用场景:允许将私有IP地址映射到公网地址,以减缓IP地址空间的消耗 ①需要连接Internet,但主机没有公网IP地址 ②更换了一个新的 ...
- c#线程间传递参数
线程操作主要用到Thread类,他是定义在System.Threading.dll下.使用时需要添加这一个引用.该类提供给我们四个重载的构造函数(以下引自msdn). Thread (P ...
- windows下使用gethostbyname函数报错无法解析的外部符号
#include <winsock.h> 使用gethostbyname的函数的时候,会显示无法解析的外部符号. 主要问题是因为没有引用WS2_32的lib库 在include上面引用就行 ...
- mint-ui 输入框按下按键执行查询
环境:vue.mint-ui 功能:一个输入框,按下按键之后就执行某个功能. 截图:一个输入框 输入框html: <mt-search v-model="query" can ...
- php引用变量
引用变量:在php中引用意味着用不同的名字访问同一个变量内容 定义方式:& 总结:$b=&$a其中$b是取到了$a的地址,随着$a的地址变化,不会重新开辟空间可以根据他们的内存占用情况 ...
- Java 1.ExecutorService四种线程池的例子与说明
1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() { @Override public void run() { ...
- oracle提高查询效率的34个方面全解析
oracle提高查询效率的34个方面全解析 在一个数据库中进行操作的时候,效率是很重要的,那么,如何提高oracle的查询效率呢?笔者将从以下几个方面进行详细解析: 1.选择最有效率的表名顺序(只 ...
- Xcode 如何导入IOS项目
前言:基于mac上如何导入ios项目的文章,手机自动化项目需要进行手机元素定位,前提是导入IOS项目 1.安装Xcode 到官网下载mac版Xcode:当前使用版本Version 7.3.1 http ...