23.SpringCloud实战项目-整合统一异常处理
简介
- PassJava-Learning项目是PassJava(佳必过)项目的学习教程。对架构、业务、技术要点进行讲解。
- PassJava 是一款Java
面试刷题
的开源系统,可以用零碎时间利用小程序查看常见面试题,夯实Java基础。 - PassJava 项目可以教会你如何搭建SpringBoot项目,Spring Cloud项目
- 采用流行的技术,如 SpringBoot、MyBatis、Redis、 MySql、 MongoDB、 RabbitMQ、Elasticsearch,采用Docker容器化部署。
更好的阅读体验
文档连载目录
- 打造一款 刷Java 知识的小程序
- 打造一款 刷Java 知识的小程序(二)
- 01.五分钟搞懂分布式基础概念
- 02.快速搭建Linux环境-运维必备
- 03.配置虚拟机网络
- 04.安装Docker
- 05.Docker安装mysql
- 06.Docker安装redis
- 07.本地开发环境配置
- 08.配置Git
- 09.初始化项目和添加微服务
- 10.PassJava-微服务划分图
- 11.初始化数据库和表
- 12.搭建管理后台
- 13.自动生成前后端代码
- 14.整合MyBatis-Plus实现CRUD
- 15.生成所有微服务的CRUD代码
- 16.Spring Cloud Alibaba 组件简介
- 17.SpringCloud整合Alibaba-Nacos组件
- 18.SpringCloud整合OpenFeign组件
- 19.SpringCloud整合Alibaba-Nacos配置中心
- 20.SpringCloud整合Gateway网关
- 21.管理后台-题目类型功能
- 22.SpringCloud整合OSS对象存储
- 23.整合统一异常处理
整合统一异常处理
一、缘起
我们在写代码的时候,通常会在方法里面添加各种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();
Map<String, String> errorMap = 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
/**
* 排序
*/
@Positive
private 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());
}
代码地址
https://github.com/Jackson0714/PassJava-Platform