簡介
- 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