Spring Boot 異常處理,值得學(xué)習(xí)!
背景:
個人也是一邊學(xué)習(xí)一邊做,難免有疏漏的地方,希望朋友們在不對的地方提醒下。
技術(shù)棧:
- springBoot 2.5.3
- Mybatis-plus
- thymeleaf
- mysql
該博客簡單記錄一下自己的學(xué)習(xí)過程,如果后面作出簡單的demo來,那么會整理其中的細節(jié)發(fā)布出來。
推薦一個 Spring Boot 基礎(chǔ)教程及實戰(zhàn)示例:
??https://github.com/javastacks/spring-boot-best-practice ??
異常處理
個人粗糙的學(xué)習(xí)和理解,我把異常錯誤分為三個,4xx,5xx,error(自定義)
常用的是404和500響應(yīng)
- 404 (未找到) 服務(wù)器找不到請求的網(wǎng)頁
- 服務(wù)器內(nèi)部錯誤 服務(wù)器遇到錯誤,無法完成請求
在templates文件下創(chuàng)建404.html、500.html和error.html
如果創(chuàng)建的是4xx.html和5xx.html,那么當(dāng)頁面找不到或者程序內(nèi)部錯誤的話,SpringBoot自動匹配到這兩個頁面,具體的源碼在這里就不分析,感興趣的可以去學(xué)習(xí)下。
“
當(dāng)我想將錯誤信息返回到我自定義的頁面怎么寫?
”
我們自頂向下來思考:
- 我們訪問頁面的時候,頁面發(fā)生錯誤也好,找不到也好,是不是都要走它請求的Url,那我們怎么處理這個請求呢?
- 這時候我們自然而然的想到攔截器,所以編寫ControllerExceptionHandler類,來專門攔截所有的異常請求。
- 當(dāng)我們處理完異常后,把這個流放行,或者返回我們需要的自定義頁面上。
這樣就實現(xiàn)了我們上述的需求。
所需要的技術(shù)點:
- @ControllerAdvice
- 配合 @ExceptionHandler注解結(jié)合使用,當(dāng)異常拋到controller層時,可以對異常進行統(tǒng)一的處理,規(guī)定返回的json格式或者跳轉(zhuǎn)到指定的錯誤頁面等.
- @ExceptionHandler(Exception.class) // 表示 捕獲 全部異常
- ModelAndView 其實就是兩個作用,一個是指定返回頁面,另一個是在返回頁面的同時添加屬性
通過Logger來打印獲取相關(guān)的異常信息:
//獲取異常的信息
logger.error(() -> {
return String.format("Request URL : %s,Exception : %s ", request.getRequestURL(),e);
},e);
在這里自己走了一些彎路,小伙子自己走窄了,導(dǎo)包倒錯了??。最新面試題整理好了,大家可以在Java面試庫小程序在線刷題。
這里我導(dǎo)的包是mybatis中的:
import org.mybatis.logging.Logger;
import org.mybatis.logging.LoggerFactory;
傳參一直不對,只能走源碼的路子了,看看自己調(diào)用的什么玩意:最后就寫成了上述的代碼格式。
我看其他人寫的代碼的時候才恍然大明白,如下:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
logger.error("Requst URL : {},Exception : {}", request.getRequestURL(),e);
可能有的朋友感覺沒啥,但是我自己調(diào)了半個小時才出來,菜是原罪。
Logger這個只是在控制臺輸出,或者綁定了日志,會輸出到日志中。
接著上述問題通過ModelAndView類實現(xiàn):
“
ModelAndView像極了Model。
”
敲黑板:來新需求了!
如果我想從所有的異常中剝離出404異常并返回給SpringBoot讓他自動處理頁面怎么解。最新 Spring Boot 面試題整理好了,大家可以在Java面試庫小程序在線刷題。
按照學(xué)習(xí)的來說。當(dāng)頁面為null的時候,向上拋出一個自定義的異常類,該異常類標(biāo)注了異常狀態(tài)。
throw new NotFoundException("博客找不到,請聯(lián)系管理員"); //自定義類
HttpStatus.NOT_FOUND)(
public class NotFoundException extends RuntimeException{
public NotFoundException() {
super();
}
public NotFoundException(String message) {
super(message);
}
}
然后我們可以在總的異常中通過AnnotationUtils.findAnnotation通過傳入AnnotatedElement和注解類型來查找方法或者類對象上的注解。
如果滿足條件可以拋出異常讓SpringBoot接管。
if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null) {
throw e;
}