Spring Boot學(xué)習(xí)入門(mén)之統(tǒng)一異常處理詳解
前言
關(guān)于之前的一篇所講到的表單驗(yàn)證中提到,如果產(chǎn)生錯(cuò)誤,可以得到錯(cuò)誤的信息,但是返回值的問(wèn)題卻沒(méi)有考慮。
其中所提到的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)證不通過(guò),我們不應(yīng)該返回null的,這會(huì)對(duì)前端來(lái)說(shuō)并不友好。
所以我們應(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;
}
}
這樣一來(lái),返回的結(jié)果中的json的格式是固定的。
雖然我們的希望是好的,但是并不是總是可以這樣的,因?yàn)椴还苁菍?duì)底層的數(shù)據(jù)庫(kù)操作過(guò)程,還是業(yè)務(wù)層的處理過(guò)程,還是控制層的處理過(guò)程,都不可避免會(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í)行方法的過(guò)程中遇到了一個(gè)異常,那么回得到什么樣的結(jié)果呢?
無(wú)論如何,返回的肯定不是我們之前定義好的格式的返回值。
那我們應(yīng)該怎么做呢?
這里就需要進(jìn)行統(tǒng)一的異常處理了。
@ControllerAdvice
public class ExceptionHandle {
/* 表明這個(gè)handler只處理什么類(lèi)型的異常
* */
@ExceptionHandler(value = Exception.class)
// 返回值為json或者其他對(duì)象
@ResponseBody
public ReturnType handle(Exception e) {
return new ReturnType(-1, e.getMessage(), null);
}
}
創(chuàng)建這么一個(gè)handler類(lèi),當(dāng)Controller拋出異常的時(shí)候,就會(huì)委托給這個(gè)類(lèi)其中的方法進(jìn)行執(zhí)行。
這樣一來(lái),就不會(huì)出現(xiàn)即使拋出異常,也不會(huì)得到不是我們期望的返回值的結(jié)果了。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Java16 JDK安裝并設(shè)置環(huán)境變量的方法步驟
突然想起自己大學(xué)剛接觸java的時(shí)候,要下載JDK和配置環(huán)境變量,那時(shí)候我上網(wǎng)找了很多教學(xué),本文就詳細(xì)的介紹一下Java16 JDK安裝并設(shè)置環(huán)境變量,感興趣的可以了解一下2021-09-09
Spring AOP使用@Aspect注解 面向切面實(shí)現(xiàn)日志橫切的操作
這篇文章主要介紹了Spring AOP使用@Aspect注解 面向切面實(shí)現(xiàn)日志橫切的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
深入理解Java基礎(chǔ)之try-with-resource語(yǔ)法糖
這篇文章主要介紹了深入理解Java基礎(chǔ)之try-with-resource語(yǔ)法糖,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-02-02
springboot 使用Spring Boot Actuator監(jiān)控應(yīng)用小結(jié)
本篇文章主要介紹了springboot 使用Spring Boot Actuator監(jiān)控應(yīng)用小結(jié),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02
hibernate-validator如何使用校驗(yàn)框架
高效、合理的使用hibernate-validator校驗(yàn)框架可以提高程序的可讀性,以及減少不必要的代碼邏輯,本文主要介紹了hibernate-validator如何使用校驗(yàn)框架,感興趣的可以了解一下2022-04-04
SpringCache輕松啟用Redis緩存的全過(guò)程
Spring Cache是Spring提供的一種緩存抽象機(jī)制,旨在通過(guò)簡(jiǎn)化緩存操作來(lái)提高系統(tǒng)性能和響應(yīng)速度,本文將給大家詳細(xì)介紹SpringCache如何輕松啟用Redis緩存,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下2024-07-07

