
23.SpringCloud实战项目-整合统一异常处理
发布日期:2021-05-09 03:44:18
浏览次数:19
分类:博客文章
本文共 3434 字,大约阅读时间需要 11 分钟。
简介
- PassJava-Learning项目是PassJava(佳必过)项目的学习教程。对架构、业务、技术要点进行讲解。
- PassJava 是一款Java
面试刷题
的开源系统,可以用零碎时间利用小程序查看常见面试题,夯实Java基础。 - PassJava 项目可以教会你如何搭建SpringBoot项目,Spring Cloud项目
- 采用流行的技术,如 SpringBoot、MyBatis、Redis、 MySql、 MongoDB、 RabbitMQ、Elasticsearch,采用Docker容器化部署。
更好的阅读体验
- 文档地址:
- 备用地址:
文档连载目录
整合统一异常处理
一、缘起
我们在写代码的时候,通常会在方法里面添加各种try catch来捕获异常,会发现有很多重复的代码,所以我们可以整合统一异常处理来优化代码结构。
拦截异常并统一处理我们可以用到@RestControllerAdvice
注解
二、自定义异常处理类
添加统一异常处理类注解
@RestControllerAdvice
添加日志注解
@Slf4j
添加异常处理方法注解
@ExceptionHandler
package com.jackson0714.passjava.question.exception;/** 集中处理所有异常 */@Slf4j@RestControllerAdvice(basePackages = "com.jackson0714.passjava.question.controller")public class PassjavaExceptionControllerAdvice { @ResponseBody @ExceptionHandler(value= MethodArgumentNotValidException.class) public R handleValidException(MethodArgumentNotValidException e) { log.error("数据校验出现问题{},异常类型:{}", e.getMessage(), e.getClass()); BindingResult bindingResult = e.getBindingResult(); MaperrorMap = new HashMap<>(); bindingResult.getFieldErrors().forEach((fieldError)->{ errorMap.put(fieldError.getField(), fieldError.getDefaultMessage()); }); return R.error(BizCodeEnum.VALID_EXCEPTION.getCode(), BizCodeEnum.VALID_EXCEPTION.getMsg()).put("data", errorMap); } @ExceptionHandler(value=Throwable.class) public R handleException(Throwable throwable) { log.error("未知异常{},异常类型:{}", throwable.getMessage(), throwable.getClass()); return R.error(BizCodeEnum.UNKNOWN_EXCEPTION.getCode(), BizCodeEnum.UNKNOWN_EXCEPTION.getMsg()); }}
三、推荐的系统错误码
1.错误码和错误信息定义类
1.错误码长度:5个数字
2.前两位:业务场景
3.后三位:错误码
10:通用业务 001:参数格式校验错误(10001)11:会员业务12:题目业务13:内容业务14:学习业务
2.错误码枚举类
com.jackson0714.common.exception.BizCodeEnum
定义了两种异常枚举:系统未知异常、参数格式校验失败
package com.jackson0714.common.exception;public enum BizCodeEnum { UNKNOWN_EXCEPTION(10000, "系统未知异常"), VALID_EXCEPTION(10001, "参数格式校验失败"); private int code; private String msg; BizCodeEnum(int code, String msg) { this.code = code; this.msg = msg; } public int getCode() { return code; } public String getMsg() { return msg; }}
四、测试代码
测试场景1:校验参数displayOrder必须为正整数,如果displayOrder不为正整数,则会抛出异常
- 1.实体类上添加校验注解
@Positive
/** * 排序 */@Positiveprivate Integer displayOrder;
- 2.controller类里面添加save方法,并添加校验参数注解@Valid
/*** 保存*/@RequestMapping("/save")public R save(@Valid @RequestBody QuestionEntity question){ questionService.save(question); return R.ok();}
测试:
用Postman工具调用save方法
请求地址:
http://192.168.10.160:8060/api/question/v1/admin/question/save
请求参数:
{ "displayOrder": 0.2}
返回结果:
{ "msg": "参数格式校验失败", "code": 10001, "data": { "displayOrder": "必须是正数" }}
测试场景2:对于代码里面直接抛出的异常,也可以handle
1.controller类里面添加查询题目的方法,并抛出Exception异常
/*** 信息*/@RequestMapping("/info/{id}")//@RequiresPermissions("question:question:info")public R info(@PathVariable("id") Long id) throws Exception { QuestionEntity question = questionService.getById(id); throw new Exception("test"); //return R.ok().put("question", question);}
测试:
用Postman工具调用save方法
请求地址:
http://192.168.10.160:8060/api/question/v1/admin/question/save
返回结果:
{ "msg": "系统未知异常", "code": 10000}
证明统一处理方法被调用了:
@ExceptionHandler(value=Throwable.class)public R handleException(Throwable throwable) { return R.error(BizCodeEnum.UNKNOWN_EXCEPTION.getCode(), BizCodeEnum.UNKNOWN_EXCEPTION.getMsg());}
代码地址
公众号
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2025年04月17日 15时51分52秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
11.2.6 时间值的小数秒
2021-05-08
Redis源码分析(七)--- zipmap压缩图
2021-05-08
【MySQL】(九)触发器
2021-05-08
Oracle 11G环境配置
2021-05-08
【Python】(十二)IO 文件处理
2021-05-08
【Oozie】(三)Oozie 使用实战教学,带你快速上手!
2021-05-08
师兄面试遇到这条 SQL 数据分析题,差点含泪而归!
2021-05-08
C语言的数值溢出问题(上)
2021-05-08
8051单片机(STC89C52)以定时器中断模式实现两倒计时器异步计时
2021-05-08
vue项目通过vue.config.js配置文件进行proxy反向代理跨域
2021-05-08
android:使用audiotrack 类播放wav文件
2021-05-08
ACM/NCPC2016 C Card Hand Sorting(upc 3028)
2021-05-08
SLAM学习笔记-求解视觉SLAM问题
2021-05-08
程序员应该知道的97件事
2021-05-08
shell编程(六)语言编码规范之(变量)
2021-05-08
vimscript学习笔记(二)预备知识
2021-05-08
Android数据库
2021-05-08
HTML基础,块级元素/行内元素/行内块元素辨析【2分钟掌握】
2021-05-08