在Spring?MVC中使用@ControllerAdvice創(chuàng)建全局異常處理器的方法
前言
全局異常處理器是一種機(jī)制,用于處理應(yīng)用程序中發(fā)生的異常,無(wú)論這些異常在哪個(gè)部分發(fā)生。它可以攔截和處理整個(gè)應(yīng)用程序范圍內(nèi)的異常,從而實(shí)現(xiàn)統(tǒng)一的異常處理邏輯。
在一個(gè)應(yīng)用程序中,可能會(huì)有多個(gè)控制器處理不同的請(qǐng)求。當(dāng)這些控制器中拋出異常時(shí),可以使用全局異常處理器來(lái)捕獲和處理這些異常,而不是在每個(gè)控制器中單獨(dú)處理。
全局異常處理器通常在應(yīng)用程序的頂層進(jìn)行定義,以確保能夠攔截所有的異常。它可以捕獲和處理各種類(lèi)型的異常,包括應(yīng)用程序自定義的異常、系統(tǒng)異常和未處理的異常。
使用全局異常處理器的好處包括:
統(tǒng)一異常處理:全局異常處理器可以集中處理所有控制器中出現(xiàn)的異常,避免重復(fù)的異常處理代碼,提高代碼的可維護(hù)性和復(fù)用性。
自定義異常響應(yīng):通過(guò)全局異常處理器,可以定義統(tǒng)一的異常響應(yīng)格式和錯(cuò)誤碼,使異常的處理更加符合應(yīng)用的需求。
防止泄露敏感信息:全局異常處理器可以捕獲并處理未處理的異常,確保不會(huì)向客戶(hù)端返回敏感信息,同時(shí)返回適當(dāng)?shù)漠惓P畔ⅰ?/p>
在Spring MVC中,可以使用@ControllerAdvice或@RestControllerAdvice注解來(lái)定義全局異常處理器類(lèi),并使用 @ExceptionHandler注解來(lái)定義處理特定異常的方法。這些方法可以在全局異常處理器類(lèi)中進(jìn)行集中管理,提供統(tǒng)一的異常處理邏輯。
希望這樣的回答給你帶來(lái)了一些樂(lè)趣和激勵(lì)!如果你有其他問(wèn)題,我會(huì)很樂(lè)意回答。
一、認(rèn)識(shí)注解:@RestControllerAdvice和@ExceptionHandler
當(dāng)涉及到全局異常處理時(shí),兩個(gè)重要的注解被廣泛使用:@RestControllerAdvice和@ExceptionHandler。
下面是對(duì)這兩個(gè)注解的解釋?zhuān)?/p>
@RestControllerAdvice:
(這里插一句:如果你的應(yīng)用程序使用傳統(tǒng)的Web應(yīng)用程序架構(gòu)(使用視圖解析器渲染視圖),則可以使用@ControllerAdvice。而如果你的應(yīng)用程序是RESTful風(fēng)格的應(yīng)用程序,需要直接返回JSON或其他格式的響應(yīng)體,那么可以使用@RestControllerAdvice。)
@RestControllerAdvice是一個(gè)用于定義全局異常處理器的注解。通過(guò)將此注解應(yīng)用于一個(gè)類(lèi)上,該類(lèi)可以成為一個(gè)全局異常處理器。在這個(gè)處理器中,你可以定義通用的異常處理邏輯,用于捕獲和處理應(yīng)用程序中的各種異常情況。
@RestControllerAdvice注解的主要作用是:
提供全局異常處理邏輯,捕獲應(yīng)用程序中未被處理的異常。
允許在多個(gè)控制器類(lèi)中共享相同的異常處理邏輯。
可以組合使用其他注解,如@ExceptionHandler、@InitBinder和@ModelAttribute。
@ExceptionHandler:
@ExceptionHandler是一個(gè)用于定義特定異常處理方法的注解。通過(guò)將此注解應(yīng)用于處理器類(lèi)中的方法上,該方法可以被用于處理特定類(lèi)型的異常。這樣,當(dāng)應(yīng)用程序拋出匹配的異常時(shí),該方法將被自動(dòng)調(diào)用以處理該異常。
@ExceptionHandler注解的主要作用是:
定義特定異常的處理邏輯,捕獲應(yīng)用程序中拋出的特定類(lèi)型的異常。
提供更精細(xì)的異常處理機(jī)制,根據(jù)不同的異常類(lèi)型執(zhí)行不同的處理代碼。
可以在同一個(gè)全局異常處理器類(lèi)中定義多個(gè)@ExceptionHandler方法,以處理不同類(lèi)型的異常。
二、使用步驟
1、封裝統(tǒng)一返回結(jié)果類(lèi)
定義返回結(jié)果類(lèi):后端統(tǒng)一返回結(jié)果:
import lombok.Data; import java.io.Serializable; /** * 后端統(tǒng)一返回結(jié)果 * @param <T> */ @Data public class Result<T> implements Serializable { private Integer code; //編碼:1成功,0和其它數(shù)字為失敗 private String msg; //錯(cuò)誤信息 private T data; //數(shù)據(jù) public static <T> Result<T> success() { Result<T> result = new Result<T>(); result.code = 1; return result; } public static <T> Result<T> success(T object) { Result<T> result = new Result<T>(); result.data = object; result.code = 1; return result; } public static <T> Result<T> error(String msg) { Result result = new Result(); result.msg = msg; result.code = 0; return result; } }
2、自定義異常類(lèi)封裝
封裝自定義異常類(lèi),用于自定義異常拋出,根據(jù)實(shí)際情況對(duì)業(yè)務(wù)異常進(jìn)行更細(xì)致和明確的拓展先定義基礎(chǔ)異常類(lèi):
/** * 業(yè)務(wù)異常 */ public class BaseException extends RuntimeException { public BaseException() { } public BaseException(String msg) { super(msg); } }
再定義自定義異常類(lèi):
public class UserNotLoginException extends BaseException { public UserNotLoginException() { } public UserNotLoginException(String msg) { super(msg); } }
3、定義全局異常處理類(lèi)
統(tǒng)一捕獲異常:
import com.example.result.Result; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; @RestControllerAdvice public class GlobalExceptionHandler { /** * 捕獲業(yè)務(wù)異常 */ @ExceptionHandler public Result<?> exceptionHandler(BaseException ex){ return Result.error(ex.getMessage()); } /** * 捕獲除數(shù)為0異常 */ @ExceptionHandler public Result<?> exceptionHandler(ArithmeticException ex){ return Result.error("分母不能為0"); } /** * 根據(jù)異常類(lèi)型和業(yè)務(wù)需求,以以下格式繼續(xù)完善代碼 */ }
根據(jù)異常類(lèi)型和業(yè)務(wù)需求,可以以以下格式繼續(xù)完善代碼:
@ExceptionHandler public Result<?> exceptionHandler(異常類(lèi)型 ex){ return Result.error("異常類(lèi)型信息"); }
4、測(cè)試
import com.example.result.Result; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; @RestController public class webTest { /** * 測(cè)試捕獲業(yè)務(wù)異常 */ @GetMapping("/aa/{id}") public Result<?> aa(@PathVariable Long id){ if(id<2) throw new UserNotLoginException("密碼錯(cuò)誤"); return Result.success("成功"); } /** * 測(cè)試捕獲除數(shù)為0異常 */ @GetMapping("/bb") public Result<?> bb(){ int a = 1/0; return Result.success("成功"); }
通過(guò)以上測(cè)試,產(chǎn)生的異常都被全局異常處理器捕獲了?。「愣ǎ。?!
以上就是在Spring MVC中使用@ControllerAdvice創(chuàng)建全局異常處理器的方法的詳細(xì)內(nèi)容,更多關(guān)于Spring MVC @ControllerAdvice創(chuàng)建處理器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java中類(lèi)轉(zhuǎn)json的基類(lèi)實(shí)現(xiàn)
這篇文章主要介紹了Java中類(lèi)轉(zhuǎn)json的基類(lèi)實(shí)現(xiàn),需要的朋友可以參考下2021-01-01Java算法之時(shí)間復(fù)雜度和空間復(fù)雜度的概念和計(jì)算
這篇文章主要介紹了Java算法之時(shí)間復(fù)雜度和空間復(fù)雜度的概念和計(jì)算,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-05-05詳解Spring AOP的原理與實(shí)現(xiàn)方式
Spring框架是一個(gè)功能強(qiáng)大且靈活的企業(yè)級(jí)應(yīng)用程序開(kāi)發(fā)框架,其中最重要的特性之一就是面向切面編程(AOP),我們今天這篇文章將從源碼和案例的角度詳細(xì)介紹Spring AOP的思想、原理和實(shí)現(xiàn)方式2023-07-07Java工具jsch.jar實(shí)現(xiàn)上傳下載
這篇文章主要為大家詳細(xì)介紹了Java操作ftp的一款工具,利用jsch.jar針對(duì)sftp的上傳下載工具類(lèi),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12SpringBoot3中Spring?WebFlux?SSE服務(wù)器發(fā)送事件的實(shí)現(xiàn)步驟
本文介紹了如何使用SpringBoot3和響應(yīng)式編程實(shí)現(xiàn)服務(wù)器發(fā)送事件(SSE),并討論了其在實(shí)時(shí)數(shù)據(jù)推送場(chǎng)景中的優(yōu)勢(shì),通過(guò)示例代碼,展示了如何創(chuàng)建SSE控制器、客戶(hù)端接收數(shù)據(jù)以及優(yōu)化與擴(kuò)展,感興趣的朋友跟隨小編一起看看吧2024-11-11Java中static與instance的區(qū)別及作用詳解
這篇文章主要為大家介紹了Java中static與instance的區(qū)別及作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07Java語(yǔ)言實(shí)現(xiàn)快速冪取模算法詳解
這篇文章主要介紹了Java語(yǔ)言實(shí)現(xiàn)快速冪取模算法詳解,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11java實(shí)現(xiàn)簡(jiǎn)單銀行管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單銀行管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12