SpringBoot中的@RestControllerAdvice注解詳解
1. @RestControllerAdvice注解詳解
1.1 概述
@RestControllerAdvice注解是Spring MVC和Spring Boot應(yīng)用程序中用于定義全局異常處理類的注解,它是@ControllerAdvice注解的特殊版本,用于RESTful風(fēng)格的應(yīng)用程序。
@RestControllerAdvice可以捕獲整個(gè)應(yīng)用程序中拋出的異常,并對(duì)它們進(jìn)行處理。這樣可以實(shí)現(xiàn)在整個(gè)應(yīng)用程序范圍內(nèi)統(tǒng)一處理異常的目標(biāo);
@RestControllerAdvice注解實(shí)際上是@ControllerAdvice和@ResponseBody注解的組合。這意味著,當(dāng)你使用@RestControllerAdvice注解時(shí),異常處理方法的返回值將自動(dòng)轉(zhuǎn)換為HTTP響應(yīng)的主體;
1.2 用途
@RestControllerAdvice注解用于創(chuàng)建全局異常處理類,用于捕獲和處理整個(gè)應(yīng)用程序中的異常。它適用于RESTful風(fēng)格的應(yīng)用程序,因?yàn)樗詣?dòng)將異常處理方法的返回值轉(zhuǎn)換為HTTP響應(yīng)的主體。
1.3 基本使用
要使用@RestControllerAdvice注解,只需在類上添加該注解。這個(gè)類應(yīng)包含一個(gè)或多個(gè)帶有@ExceptionHandler注解的方法,用于處理不同類型的異常。
例如:
@RestControllerAdvice public class GlobalRestExceptionHandler { @ExceptionHandler(UserNotFoundException.class) public ResponseEntity<String> handleUserNotFoundException(UserNotFoundException ex) { return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage()); } @ExceptionHandler(IllegalArgumentException.class) public ResponseEntity<String> handleIllegalArgumentException(IllegalArgumentException ex) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ex.getMessage()); } }
1.4 屬性
@RestControllerAdvice注解繼承了@ControllerAdvice注解的屬性:
annotations:
用于指定需要掃描的其他注解。只有帶有這些注解的類中的異常處理方法才會(huì)被全局異常處理類處理。
basePackages:
別名:value
用于指定需要掃描的包名。只有這些包下的類中的異常處理方法才會(huì)被全局異常處理類處理。
value:
是默認(rèn)的屬性;
用于指定要處理的異常類型。如果沒(méi)有指定value屬性,則默認(rèn)處理所有的異常類型;
basePackageClasses:
用于指定需要掃描的類。只有這些類中的異常處理方法才會(huì)被全局異常處理類處理。
assignableTypes:
用于指定需要掃描的類或接口。只有這些類或接口的實(shí)現(xiàn)類中的異常處理方法才會(huì)被全局異常處理類處理。
這些屬性可以幫助你限制全局異常處理類的作用范圍,使其只處理特定包、類或接口下的異常。
1.5 與@ExceptionHandler的結(jié)合
@RestControllerAdvice通常與@ExceptionHandler注解一起使用。在全局異常處理類中,你可以定義多個(gè)帶有@ExceptionHandler注解的方法,用于處理不同類型的異常。當(dāng)指定類型的異常在整個(gè)應(yīng)用程序中拋出時(shí),相應(yīng)的`@ExceptionHandler方法將被調(diào)用以處理該異常。由于@RestControllerAdvice注解自動(dòng)將異常處理方法的返回值轉(zhuǎn)換為HTTP響應(yīng)的主體,因此,你無(wú)需使用@ResponseBody`注解。
例如:
@RestControllerAdvice public class GlobalRestExceptionHandler { @ExceptionHandler(UserNotFoundException.class) public ResponseEntity<String> handleUserNotFoundException(UserNotFoundException ex) { return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage()); } @ExceptionHandler(IllegalArgumentException.class) public ResponseEntity<String> handleIllegalArgumentException(IllegalArgumentException ex) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ex.getMessage()); } @ExceptionHandler(Exception.class) public ResponseEntity<String> handleException(Exception ex) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("An unexpected error occurred: " + ex.getMessage()); } }
在上面的代碼中,我們定義了一個(gè)全局RESTful異常處理類,并處理了三種類型的異常:UserNotFoundException、IllegalArgumentException和Exception。對(duì)于每種異常,我們分別返回一個(gè)帶有HTTP狀態(tài)碼和錯(cuò)誤消息的ResponseEntity對(duì)象。由于我們使用了@RestControllerAdvice注解,異常處理方法的返回值將自動(dòng)轉(zhuǎn)換為HTTP響應(yīng)的主體。
1.6 總結(jié)
@RestControllerAdvice注解是一個(gè)用于定義全局RESTful異常處理類的類級(jí)別注解。通過(guò)使用@RestControllerAdvice和@ExceptionHandler注解,你可以實(shí)現(xiàn)在整個(gè)應(yīng)用程序范圍內(nèi)統(tǒng)一處理RESTful風(fēng)格的異常。它自動(dòng)將異常處理方法的返回值轉(zhuǎn)換為HTTP響應(yīng)的主體,使得代碼更加簡(jiǎn)潔、可讀和可維護(hù)。
2. @RestControllerAdvice注解 與 @ControllerAdvice注解的區(qū)別
特性 | @ControllerAdvice注解 | @RestControllerAdvice注解【實(shí)】 |
類型 | Class<?extends Throwable>[] | String |
適用場(chǎng)景 | 適用于傳統(tǒng)的Web應(yīng)用程序,需要進(jìn)行視圖解析和渲染的場(chǎng)景 | 適用于構(gòu)建RESTful風(fēng)格的Web服務(wù),需要直接返回JSON格式響應(yīng)體的場(chǎng)景 |
返回值 | 返回視圖名稱或包裝后的ModelAndView對(duì)象,用于視圖解析和渲染 | 返回JSON格式的響應(yīng)體,用于直接返回給客戶端 |
作用 | 處理控制器中的異常、綁定和預(yù)處理等操作,并在多個(gè)控制器中共享 | 處理控制器中的異常、綁定和預(yù)處理等操作,并直接返回JSON格式的響應(yīng)體,用于構(gòu)建RESTful風(fēng)格的Web服務(wù) |
使用的注解 | @ExceptionHandler、@InitBinder和@ModelAttribute等注解 | @ExceptionHandler、@InitBinder和@ModelAttribute等注解 |
返回值轉(zhuǎn)換方式 | 通過(guò)視圖解析器和模板引擎將返回值轉(zhuǎn)換為HTML或其他格式的響應(yīng)體 | 直接將返回值轉(zhuǎn)換為JSON格式的響應(yīng)體 |
返回值的處理方式 | 需要進(jìn)行視圖解析和渲染,將結(jié)果包裝成HTTP響應(yīng)體,再返回給客戶端 | 直接將結(jié)果包裝成HTTP響應(yīng)體,并返回給客戶端 |
到此這篇關(guān)于SpringBoot中的@RestControllerAdvice注解詳解的文章就介紹到這了,更多相關(guān)@RestControllerAdvice注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot中@RestControllerAdvice注解實(shí)現(xiàn)全局異常處理類
- springboot的統(tǒng)一異常處理,使用@RestControllerAdvice詳解
- SpringBoot項(xiàng)目中@RestControllerAdvice全局異常失效問(wèn)題的解決
- SpringBoot中@RestControllerAdvice @ExceptionHandler異常統(tǒng)一處理類失效原因分析
- SpringBoot中@RestControllerAdvice注解的使用
- SpringBoot的@RestControllerAdvice作用詳解
- SpringBoot常用注解@RestControllerAdvice詳解
- SpringBoot?@RestControllerAdvice注解對(duì)返回值統(tǒng)一封裝的處理方法
- SpringBoot中@RestControllerAdvice 全局異常處理的實(shí)現(xiàn)
相關(guān)文章
圖解Java?ReentrantLock的條件變量Condition機(jī)制
想必大家都使用過(guò)wait()和notify()這兩個(gè)方法把,他們主要用于多線程間的協(xié)同處理。而RenentrantLock也支持這樣條件變量的能力,而且相對(duì)于synchronized?更加強(qiáng)大,能夠支持多個(gè)條件變量,本文就來(lái)詳細(xì)說(shuō)說(shuō)2022-10-10

SpringBoot配置GlobalExceptionHandler全局異常處理器案例

Java語(yǔ)言Consistent Hash算法學(xué)習(xí)筆記(代碼示例)

圖解Springboot集成七牛云并實(shí)現(xiàn)圖片上傳功能過(guò)程

詳解Spring Boot中如何自定義SpringMVC配置