Spring Boot學(xué)習(xí)入門之統(tǒng)一異常處理詳解
前言
關(guān)于之前的一篇所講到的表單驗(yàn)證中提到,如果產(chǎn)生錯(cuò)誤,可以得到錯(cuò)誤的信息,但是返回值的問題卻沒有考慮。
其中所提到的Controller:
@RequestMapping(value = "/doRegister", method = RequestMethod.POST) public @ResponseBody User doRegister(@Valid User user, BindingResult result, Model model) { if (result.hasErrors()) { List<ObjectError> list = result.getAllErrors(); for (ObjectError error : list) { System.out.println(error.getDefaultMessage()); } return null; } System.out.println("注冊(cè).."); return user; }
如果驗(yàn)證不通過,我們不應(yīng)該返回null的,這會(huì)對(duì)前端來說并不友好。
所以我們應(yīng)該定義一個(gè)統(tǒng)一的返回格式:
public class ReturnType { private int code; private User data; private String msg; public ReturnType(int code, String msg, User data) { this.code = code; this.msg = msg; this.data = data; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public User getData() { return data; } public void setData(User data) { this.data = data; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } }
這樣一來,返回的結(jié)果中的json的格式是固定的。
雖然我們的希望是好的,但是并不是總是可以這樣的,因?yàn)椴还苁菍?duì)底層的數(shù)據(jù)庫操作過程,還是業(yè)務(wù)層的處理過程,還是控制層的處理過程,都不可避免會(huì)遇到各種可預(yù)知的、不可預(yù)知的異常需要處理。
如果存在下面這種情況:
@RequestMapping(value = "/doRegister", method = RequestMethod.POST) public @ResponseBody ReturnType doRegister(@Valid User user, BindingResult result, Model model) throws Exception { throw new Exception("new Exception"); }
這就好像在調(diào)用Service層代碼的時(shí)候,執(zhí)行方法的過程中遇到了一個(gè)異常,那么回得到什么樣的結(jié)果呢?
無論如何,返回的肯定不是我們之前定義好的格式的返回值。
那我們應(yīng)該怎么做呢?
這里就需要進(jìn)行統(tǒng)一的異常處理了。
@ControllerAdvice public class ExceptionHandle { /* 表明這個(gè)handler只處理什么類型的異常 * */ @ExceptionHandler(value = Exception.class) // 返回值為json或者其他對(duì)象 @ResponseBody public ReturnType handle(Exception e) { return new ReturnType(-1, e.getMessage(), null); } }
創(chuàng)建這么一個(gè)handler類,當(dāng)Controller拋出異常的時(shí)候,就會(huì)委托給這個(gè)類其中的方法進(jìn)行執(zhí)行。
這樣一來,就不會(huì)出現(xiàn)即使拋出異常,也不會(huì)得到不是我們期望的返回值的結(jié)果了。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Java并發(fā)編程:volatile關(guān)鍵字詳細(xì)解析
這篇文章主要介紹了Java并發(fā)編程:volatile關(guān)鍵字詳細(xì)解析,對(duì)學(xué)習(xí)volatile關(guān)鍵字有一定的認(rèn)識(shí),有需要的可以了解一下。2016-11-11Java中BigDecimal與0比較的一個(gè)坑實(shí)戰(zhàn)記錄
BigDecimal屬于大數(shù)據(jù),精度極高,不屬于基本數(shù)據(jù)類型,屬于java對(duì)象,下面這篇文章主要給大家介紹了關(guān)于Java中BigDecimal與0比較的一個(gè)坑的相關(guān)資料,需要的朋友可以參考下2022-12-12intellij idea修改maven配置時(shí)總是恢復(fù)默認(rèn)配置的解決方法idea版本(2020.2.x)
這篇文章主要介紹了intellij idea修改maven配置時(shí)總是恢復(fù)默認(rèn)配置的解決方法idea版本(2020.2.x),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08SpringBoot Knife4j在線API文檔框架基本使用
knife4j是為Java MVC框架集成Swagger生成Api文檔的增強(qiáng)解決方案,這篇文章主要介紹了SpringBoot中使用Knife4J在線API文檔框架,需要的朋友可以參考下2022-12-12plantuml畫圖實(shí)現(xiàn)代碼畫時(shí)序圖UML用例圖
這篇文章主要為大家介紹了plantuml畫圖實(shí)現(xiàn)代碼畫時(shí)序圖示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07