在Spring Boot中使用切面统一处理自定义的异常

最近我们将项目的一个单独模块提取了一个微服务,这个微服务主要负责其他系统的接入。目的是发布主项目的时候不会影响到其他系统接入。在提取出的微服务中,需要定义一个正常返回的报文和异常返回的报文。正常返回报文就是正常业务返回的数据报文,异常返回报文我这里定义为比如一些校验异常或是权限异常等等,这里不包括程序出现的异常,比如数据库出错这些。我暂时是这样定义的。大家有好的方式也可以一块讨论。

正常的报文:正常的报文比较松散,我指定为自己去定义报文格式。不过基本有这两个字段

{"requestId": "ed93f3cb-f35e-473f-b9f3-0d451b8b79c6","data": {...}
}

requestId是为了更容易跟踪程序错误

异常的报文

{"requestId": "ed93f3cb-f35e-473f-b9f3-0d451b8b79c6","error": {"code": "NotNullAndLengthErr.waybillNo","msg": "运单号不为空且长度需为15位或12位"}
}

在程序中主要处理异常的报文,多为对权限的校验,业务的校验,我将这些校验出错的情况用异常的方式抛出,然后在切面中统一处理自定义的异常

public class OccpDdsRuntimeException extends RuntimeException {private ErrorCodeEnum errorCodeEnum;public ErrorCodeEnum getErrorCodeEnum() {return errorCodeEnum;}public OccpDdsRuntimeException(ErrorCodeEnum errorCodeEnum) {super(errorCodeEnum.getErrMsg());this.errorCodeEnum = errorCodeEnum;}
}

这里的ErrorCodeEnum是我自定义的Enum类,为的是定义一些错误,比如校验错误,权限错误等

public enum ErrorCodeEnum {NotNullAndLengthErrWaybillNo("NotNullAndLengthErr.waybillNo","运单号不为空且长度需为15位或12位", 420);private String errCode;private String errMsg;private int httpStatus;ErrorCodeEnum(String errCode, String errMsg, int httpStatus) {this.errCode = errCode;this.errMsg = errMsg;this.httpStatus = httpStatus;}public String getErrCode() {return errCode;}public String getErrMsg() {return errMsg;}public int getHttpStatus() {return httpStatus;}
}

下面看一下真正的绝学,在切面中统一处理自定义的异常以达到返回异常的报文

/*** 全局异常处理*/
@ControllerAdvice
public class OccpDdsExceptionHandler {private static Logger LOG = LoggerFactory.getLogger(OccpDdsExceptionHandler.class);@ExceptionHandler(OccpDdsRuntimeException.class)	//1@ResponseBody	//2public Map<String, Object> handleException(OccpDdsRuntimeException ex, HttpServletResponse response) {Map<String, Object> responseBody = new HashMap<>();String requestId = getRequestId();if (ex instanceof OccpDdsRuntimeException) {//这里进行组装报文的操作}//返回报文return responseBody;}private String getRequestId() {HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();return (String)request.getAttribute(REQUEST_ID);}}

上面的代码中注释第一行完全可以自己去组装想要的报文,1处定义了捕获哪个异常,2表示返回的对象类型。

这样就可以测试一下项目当抛出自定义异常了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330927.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 8的新特性—终极版

转载自 Java 8的新特性—终极版 1. 简介 毫无疑问&#xff0c;Java 8是Java自Java 5&#xff08;发布于2004年&#xff09;之后的最重要的版本。这个版本包含语言、编译器、库、工具和JVM等方面的十多个新特性。在本文中我们将学习这些新特性&#xff0c;并用实际的例子说明在…

ReviewForJob——java虚拟机的垃圾回收策略(个人总结)

理解jvm的垃圾回收策略&#xff0c;需要解决以下3个问题问题1&#xff1a;哪些内存需要回收&#xff1f;问题2&#xff1a;什么时候进行回收&#xff1f;问题3&#xff1a;怎样来回收&#xff1f;【解决问题1】哪些内存需要回收&#xff1f;jvm的内存区域有5大块&#xff1a;1&…

使用静态代理模式实现公用的报表导出功能

先聊一下什么是代理模式&#xff1f; 代理模式 给某个对象提供一个代理对象&#xff0c;并由代理独享控制对原对象的引用。什么意思呢&#xff1f;代理模式就有点像我们生活中常见的中介。 举个例子&#xff0c;我想买辆二手车&#xff0c;第一种方式是自己去找车源&#xff…

java前台线程(普通线程) 和 后台线程

【1】普通线程&#xff1a; 就是指 用户 创建的一般线程&#xff0c;具有个体性&#xff0c;不具有提供公共服务的性质&#xff0c;因此&#xff0c; 通常需要我们在 线程的 循环语句中 手动编写 循环结束语句&#xff0c;也即 线程运行终止的条件语句&#xff1b; 【2】后台线…

mysql中使用CASE WHEN

简单的使用CASE WHEN CASE SCORE WHEN A THEN 优 ELSE 不及格 END CASE SCORE WHEN B THEN 良 ELSE 不及格 END CASE SCORE WHEN C THEN 中 ELSE 不及格 END上面的sql等同于 CASE SCORE WHEN A THEN 优 WHEN B THEN 良 WHEN C THEN 中 ELSE 不及格 ENDTHEN后面的值与ELSE后面…

Java生成随机数的几种高级用法

转载自 进阶 | Java生成随机数的几种高级用法&#xff01;言归正传&#xff0c;众所周知&#xff0c;随机数是任何一种编程语言最基本的特征之一。而生成随机数的基本方式也是相同的&#xff1a;产生一个0到1之间的随机数。看似简单&#xff0c;但有时我们也会忽略了一些有趣的…

Java 可重入锁内存可见性分析

转载自 深度好文 | Java 可重入锁内存可见性分析一个习以为常的细节之前在做 ReentrantLock 相关的试验&#xff0c;试验本身很简单&#xff0c;和本文相关的简化版如下&#xff1a;&#xff08;提示&#xff1a;以下代码均可左右滑动&#xff09; private static ReentrantLoc…

java正则表达式 ^expr 和 [^expr] 和 ^[^expr]的比较

public class Main {private static String[] array {"Jav", "Java", "Hello"}; public static void main(String[] args) {String[] regexs {"^Java", // 以 Java开头的字符串"[^Java]",// 除了 J a v a 之外 的任何字符…

优秀 Java 程序员写代码的风格

转载自 涨姿势 | 优秀 Java 程序员写代码的风格今天突发奇想&#xff0c;对编码习惯和 编程风格 很感兴趣&#xff0c;于是乎&#xff0c;找了一下关于编程风格&#xff08;Java篇&#xff09;的资料&#xff0c;希望对爱好编码或者开始学习编码的同学有帮助&#xff01;来自《…

2017尼毕鲁笔试算法题

【1】题目&#xff1a; 给定一个无序数组&#xff0c;找到最长的单调自增子序列&#xff08;不一定连续&#xff0c;但是顺序不能乱&#xff09;的长度&#xff1b; 【2】看个荔枝&#xff1a;给定数组 [10, 9, 2, 5, 3, 7, 101, 18] 输出结果为 [2, 3, 7, 101]。。算法时间…

2018年不能错过的 14 个 Java 库

转载自 2018年不能错过的 14 个 Java 库下面是整理给你的 2018 年不应该错过的 14 个 Java 库包清单&#xff0c;多多少少大家应该都接触过一些&#xff0c;如果还没听过那就OUT了。GuiceGuice是一个Java 6以上支持依赖注入框架。由谷歌提供。OkHttpHTTP是现代网络的通讯方式。…

Spring MVC Boot Cloud 技术教程汇总

转载自 Spring MVC & Boot & Cloud 技术教程汇总昨天我们发布了Java成神之路上的知识汇总&#xff0c;今天继续。 Java成神之路技术整理&#xff08;长期更新&#xff09; 以下是Java技术栈微信公众号发布的关于 Spring/ Spring MVC/ Spring Boot/ Spring Cloud 的技术…

group by分组、having() 筛选组的用法

【1】选出 除语文学科外&#xff0c;且学科平均分大于60 的每个学科的最高最低分&#xff1b;

Java成神之路技术整理

转载自 Java成神之路技术整理以下是Java技术栈微信公众号发布的所有关于 Java 的技术干货&#xff0c;会从以下几个方面汇总&#xff0c;本文会长期更新。 Java 基础篇Java 集合篇Java 多线程篇Java JVM篇Java 进阶篇Java 新特性篇Java 工具篇Java 书籍篇 Java基础篇 8张图带你…

RFC+JSF术语

RFC 请求注解&#xff08;Request For Comments&#xff09; JSF JavaServer Faces (JSF) is a Java specification for building component-based user interfaces for web applications.

图解 5 种 Join 连接及实战案例!(inner/ left/ right/ full/ cross)

转载自 图解 5 种 Join 连接及实战案例&#xff01;&#xff08;inner/ left/ right/ full/ cross&#xff09; Join 连接在日常开发用得比较多&#xff0c;但大家都搞清楚了它们的使用区别吗&#xff1f;&#xff1f;一文带你上车~~ 内连接 inner join 内连接是基于连接谓词…

接口、多态

一.接口 1.接口的定义和使用 接口名&#xff1a;和类名一样&#xff0c;首字母大写 public interface 接口名{//接口中的成员&#xff0c;一般写一些抽象方法 } public class 类名 implements 接口名{//复写接口中所有的抽象方法 } 2.接口的成员热点&#xff1a; &#xff0…

基础笔试编程题(jz)

【1】计算某个单词在某文件中出现的次数. // 计算某个单词在某文件中出现的次数. public class WordCounter {private static int counter;private static String path System.getProperty("user.dir") File.separator "src" File.separator "com…

到底什么是 OAuth 2.0

转载自 到底什么是 OAuth 2.0 ? 一文秒懂&#xff01;- 理解OAuth 2.0OAuth是一个关于授权&#xff08;authorization&#xff09;的开放网络标准&#xff0c;在全世界得到广泛应用&#xff0c;目前的版本是2.0版。本文对OAuth 2.0的设计思路和运行流程&#xff0c;做一个简明…

在eclipse中创建maven项目错误的解决方法:Could not resolve archetype org.apache.maven.archetypes:maven-archetype-qu

当我们在ecipse安装 maven插件后&#xff0c; (how to install maven plugin named m2eclipse) You can install the lastest M2Eclipse release (1.7.0) by using the following update site from within Eclipse: http://download.eclipse.org/technology/m2e/releases 创建…