配置

大致说下流程,

  1. 首先我们自定义一个自己的异常类CustomException,继承RuntimeException。再写一个异常管理类ExceptionManager,用来抛出自定义的异常。

  2. 然后使用Spring提供的注解@RestControllerAdvice或者@ControllerAdvice写一个统一异常处理的类,在这个类中写一个带有@ExceptionHandler(Exception.class)注解的方法,这个方法会接收到所有抛出的异常,在方法内部我们就可以写自己的异常处理逻辑。

  3. 如果参数是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定义统一异常错误码返回的更多相关文章

  1. AgileBoot - 项目内统一的错误码设计

    本篇文章主要探讨关于统一错误码的设计,并提供笔者的实现 欢迎大家讨论,指正. 该错误码的设计在仓库: github:https://github.com/valarchie/AgileBoot-Bac ...

  2. JavaWeb项目中获取对Oracle操作时抛出的异常错误码

    最近在项目中碰到了这么一个需求,一个JavaWeb项目,数据库用的是Oracle.业务上有一个对一张表的操作功能,当时设置了两个字段联合的唯一约束.由于前断没有对重复字段的校验,需要在插入时如果碰到唯 ...

  3. Redis Windows 服务启动异常 错误码1067

    https://blog.csdn.net/after_you/article/details/62215163 Redis Windows 服务启动异常 错误码1067 下载了Redis 2.8.2 ...

  4. 自己写的驱动用CreateFile打开时错误码返回1的问题

    就像题目上说的,今天在写一个例子代码时遇到了这个问题,下面是当时驱动层和应用层的代码: #include <ntddk.h> #define BASE_CODE 0x800 #define ...

  5. (三)SpringBoot定义统一返回result对象

    一:定义响应码枚举 package com.example.demo.core.ret; /** * @Description: 响应码枚举,参考HTTP状态码的语义 * @author * @dat ...

  6. MySQL 异常错误码使用 及 对照表

    DECLARE CONTINUE HANDLER FOR SQLWARNING, SQLEXCEPTION, NOT FOUND BEGIN GET DIAGNOSTICS CONDITION cod ...

  7. 彻底解决ASP.NET MVC 3 404错误码返回302的问题

    转自:http://blog.csdn.net/mycloudke/article/details/9746333 404状态码:,意味着当在页面上显示用户点击不存在,提高用户体验度,搜索引擎会放弃这 ...

  8. springboot创建统一异常拦截器全局处理 异常

    1.创建Exception类 public class MyException extends RuntimeException { private ErrorCodeEnum errorCode; ...

  9. Spring MVC怎么统一异常管理?

    1. 在类上加上@ControllerAdvice注解 2. 在方法上加上@ExceptionHandler注解 @ExceptionHandler(Exception.class) @Respons ...

随机推荐

  1. [UE4]根据时间、速度进行插值:Finterp to Constant

    一般在“Tick”事件中使用: Current:当前值 Target:期望的目标值 Delta Time:时间变化值. Interp Speed:插值速度 返回值:从“当前值”过渡到“期望的目标值”的 ...

  2. [UE4]在蓝图中设置图片

  3. [UE4]子弹穿透多个机器人

    一.将机器人的碰撞类型改成“OverLap” 二.使用“MultiLineTraceByChannel”这个是可以穿透检测,可以检测到多个物体(前提是被检测物体的碰撞类型是“OverLap”).“Li ...

  4. Linux上面的MTU含义

    问题场景描述: 最近在搞一个很菜的程序--FTP上传文件. 但是这个 很菜的程序搞的我脑袋疼了 半个月. 在linux上面部署了我的程序,上传文件在1KB以下顺利上传,但是1KB以上上传不上去. 程序 ...

  5. T-SQL 无参数的存储过程的创建和执行

    use StudentManager go if exists(select * from sysobjects where name='usp_ScoreQuery') drop procedure ...

  6. 转 WiFi的STA和AP模式指什么?

    1):AP,也就是无线接入点,是一个无线网络的创建者,是网络的中心节点.一般家庭或办公室使用的无线路由器就一个AP. 2):STA站点,每一个连接到无线网络中的终端(如笔记本电脑.PDA及其它可以联网 ...

  7. Motherboard Chipsets and the Memory Map.主板芯片组与内存映射

    原文标题:Motherboard Chipsets and the Memory Map 原文地址:http://duartes.org/gustavo/blog/ [注:本人水平有限,只好挑一些国外 ...

  8. ELK新手教程(二)

    暂不排版,后面整理. logstash 使用配置文件 在bin目录下创建一个名为test.conf的文件,内容为: input { stdin {} } output { stdout{} } 执行命 ...

  9. Postgresql ERROR: permission denied for relation app_info

    启用终端,: 进入mydb数据库:\c mydb 然后给当前数据库的角色赋予权限:GRANT ALL PRIVILEGES ON TABLE 表名  TO 角色名;

  10. MySQL/InnoDB中,对于锁的认识

    MySQL/InnoDB的加锁,一直是一个面试中常问的话题.例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?我在工作过程中,也会经常用到,乐观锁,排它锁,等.于是今天就对 ...