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]扔枪后捡枪:Get Overlapping Actors
一.搜索碰撞体是否碰撞到枪,使用Get Overlapping Actors,只搜索Class Filter设置的对象类型.Get Overlapping Actors没有Class Filter参数 ...
- php安装imagemagick扩展 常见问题与解决方案(win平台)
1.写在前面 1-1.ImageMagick介绍 ImageMagick是一套功能强大.稳定而且开源的工具集和开发包,可以用来读.写和处理超过89种基本格式的图片文件,包括流行的TIFF.JPEG.G ...
- 如何用MAT分析Android程序的内存泄露
本文结合<Android开发艺术探索>书籍中的内存分析例子来讲解如何利用MAT工具来查找内存泄漏(以AndroidStudio开发工具为例). 1.下载MAT(Eclipse Memory ...
- UE4如何检测目标在锥形视野内
转自:http://blog.csdn.net/l346242498/article/details/70237083 做UE4游戏AI方面经常会遇到一个问题,就是何如判定目标在AI单位的视野范围内, ...
- 分段覆盖率TPR
黑产监控中,需要尽可能做到尽可能少的误伤和尽可能准确地探测,可以选择“在FPR较低时的TPR加权平均值”作为平均指标. 根据混淆矩阵计算TPR(覆盖率)和FPR(打扰率): 覆盖率:TPR = TP ...
- Maven 包含资源文件
Maven打包时,如何包含资源文件(src/main/java | src/main/resources): 参考博客:http://blog.csdn.net/jsflzhong/article/d ...
- hook mono实现Assembly.Load从指定路径读取文件
mono-unity github: https://github.com/Unity-Technologies/mono/blob/unity-staging/mono/metadata/assem ...
- 本地IP,掩码,网关,DNS设置
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Hadoop的RPC工作原理
RPC远程过程调用: Hadoop的远程过程调用(Remote Procedure Call,RPC)是Hadoop中核心通信机制,RPC主要通过所有Hadoop的组件元数据交换,如MapReduce ...
- java对redis的基本操作(初识)
一.server端安装 1.下载 https://github.com/MSOpenTech/redis 可看到当前可下载版本:redis2.6