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 ...
随机推荐
- windows server 2008通过任务计划程序定时访问网站
1.新一个.bat文件,如: @echo offstart 网址exit 2.打windows server 2008,新建任务计划程序定时访问任务
- 由于ip改变重新配置CM集群
修改所有主机/etc/hosts 修改所有agent节点的/opt/cm-5.5.1/etc/cloudera-scm-agent/config.ini,中server的ip 主节点启动cm serv ...
- 命令提示符没办法登录MySQL
前几天在CMD命令下输入 MYSQL -UROOT -P 一直显示命令无效. 后来想知道原来是要在MYSQL的BIN(安装)目录下才能访问该命令,如果要在其他路径下使用sql命令,那么要配置MYSQ ...
- oracle的sqlldr常见问题
http://www.orafaq.com/wiki/SQL*Loader_FAQ#Can_one_skip_certain_columns_while_loading_data.3F What is ...
- redis永久化存储
redis持久化存储 原因:redis是存放在内存中的,断电会导致数据丢失解决方法:把redis数据进行持久性存储,将其存储在磁盘中. 存储方式:1.RDBRDB中文名为快照/内存快照,Redis按照 ...
- JVM总结-java对象的内存布局
在 Java 程序中,我们拥有多种新建对象的方式.除了最为常见的 new 语句之外,我们还可以通过反射机制.Object.clone 方法.反序列化以及 Unsafe.allocateInstance ...
- SPOJ3276 D-query
题意:n个数 a1...an,q组询问,每组询问给定 l,r,输出 [ l, r ] 有多少不同的数 ( n ≤30000, q ≤200000, ai ≤ 106 ) 离线 + 树状数组维护 #in ...
- 项目经验分享[转自min.jiang]
最近三个月,我非常荣幸的做为TeamLeader带领几个小组成员做了一个国外项目,这里想为大家分享一些小经验,尽管我佣有六年多的项目经验,但我一直的方向是架构师.大家知道架构师一般情况是偏向技 ...
- 最好的ie版本检测方式
预备知识:NodeList的实时性 通过 document.getElementsByTagName,document.forms ,document.images 等方法获取到nodelist以后 ...
- 37. sqlplus工具连接服务端或其他电脑的oracle方式
1. 方式1:IP:监听端口/实例ID,例如:192.168.0.1:1521/orcl 2.方式2:IP:监听端口/服务名,例如:192.168.0.1:1521/ORCL.168.0.1 查看服务 ...