SpringBoot中的@RestControllerAdvice注解詳解
1. @RestControllerAdvice注解詳解
1.1 概述
@RestControllerAdvice注解是Spring MVC和Spring Boot應(yīng)用程序中用于定義全局異常處理類的注解,它是@ControllerAdvice注解的特殊版本,用于RESTful風(fēng)格的應(yīng)用程序。
@RestControllerAdvice可以捕獲整個應(yīng)用程序中拋出的異常,并對它們進(jìn)行處理。這樣可以實(shí)現(xiàn)在整個應(yīng)用程序范圍內(nèi)統(tǒng)一處理異常的目標(biāo);
@RestControllerAdvice注解實(shí)際上是@ControllerAdvice和@ResponseBody注解的組合。這意味著,當(dāng)你使用@RestControllerAdvice注解時,異常處理方法的返回值將自動轉(zhuǎn)換為HTTP響應(yīng)的主體;
1.2 用途
@RestControllerAdvice注解用于創(chuàng)建全局異常處理類,用于捕獲和處理整個應(yīng)用程序中的異常。它適用于RESTful風(fēng)格的應(yīng)用程序,因為它自動將異常處理方法的返回值轉(zhuǎn)換為HTTP響應(yīng)的主體。
1.3 基本使用
要使用@RestControllerAdvice注解,只需在類上添加該注解。這個類應(yīng)包含一個或多個帶有@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:
用于指定需要掃描的其他注解。只有帶有這些注解的類中的異常處理方法才會被全局異常處理類處理。
basePackages:
別名:value
用于指定需要掃描的包名。只有這些包下的類中的異常處理方法才會被全局異常處理類處理。
value:
是默認(rèn)的屬性;
用于指定要處理的異常類型。如果沒有指定value屬性,則默認(rèn)處理所有的異常類型;
basePackageClasses:
用于指定需要掃描的類。只有這些類中的異常處理方法才會被全局異常處理類處理。
assignableTypes:
用于指定需要掃描的類或接口。只有這些類或接口的實(shí)現(xiàn)類中的異常處理方法才會被全局異常處理類處理。
這些屬性可以幫助你限制全局異常處理類的作用范圍,使其只處理特定包、類或接口下的異常。
1.5 與@ExceptionHandler的結(jié)合
@RestControllerAdvice通常與@ExceptionHandler注解一起使用。在全局異常處理類中,你可以定義多個帶有@ExceptionHandler注解的方法,用于處理不同類型的異常。當(dāng)指定類型的異常在整個應(yīng)用程序中拋出時,相應(yīng)的`@ExceptionHandler方法將被調(diào)用以處理該異常。由于@RestControllerAdvice注解自動將異常處理方法的返回值轉(zhuǎn)換為HTTP響應(yīng)的主體,因此,你無需使用@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()); } }
在上面的代碼中,我們定義了一個全局RESTful異常處理類,并處理了三種類型的異常:UserNotFoundException、IllegalArgumentException和Exception。對于每種異常,我們分別返回一個帶有HTTP狀態(tài)碼和錯誤消息的ResponseEntity對象。由于我們使用了@RestControllerAdvice注解,異常處理方法的返回值將自動轉(zhuǎn)換為HTTP響應(yīng)的主體。
1.6 總結(jié)
@RestControllerAdvice注解是一個用于定義全局RESTful異常處理類的類級別注解。通過使用@RestControllerAdvice和@ExceptionHandler注解,你可以實(shí)現(xiàn)在整個應(yīng)用程序范圍內(nèi)統(tǒng)一處理RESTful風(fēng)格的異常。它自動將異常處理方法的返回值轉(zhuǎn)換為HTTP響應(yīng)的主體,使得代碼更加簡潔、可讀和可維護(hù)。
2. @RestControllerAdvice注解 與 @ControllerAdvice注解的區(qū)別
特性 | @ControllerAdvice注解 | @RestControllerAdvice注解【實(shí)】 |
類型 | Class<?extends Throwable>[] | String |
適用場景 | 適用于傳統(tǒng)的Web應(yīng)用程序,需要進(jìn)行視圖解析和渲染的場景 | 適用于構(gòu)建RESTful風(fēng)格的Web服務(wù),需要直接返回JSON格式響應(yīng)體的場景 |
返回值 | 返回視圖名稱或包裝后的ModelAndView對象,用于視圖解析和渲染 | 返回JSON格式的響應(yīng)體,用于直接返回給客戶端 |
作用 | 處理控制器中的異常、綁定和預(yù)處理等操作,并在多個控制器中共享 | 處理控制器中的異常、綁定和預(yù)處理等操作,并直接返回JSON格式的響應(yīng)體,用于構(gòu)建RESTful風(fēng)格的Web服務(wù) |
使用的注解 | @ExceptionHandler、@InitBinder和@ModelAttribute等注解 | @ExceptionHandler、@InitBinder和@ModelAttribute等注解 |
返回值轉(zhuǎn)換方式 | 通過視圖解析器和模板引擎將返回值轉(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot使用@RestController處理GET和POST請求的代碼詳解
- SpringBoot中@RestControllerAdvice @ExceptionHandler異常統(tǒng)一處理類失效原因分析
- SpringBoot中@RestControllerAdvice注解的使用
- SpringBoot的@RestControllerAdvice作用詳解
- SpringBoot中@RestControllerAdvice注解實(shí)現(xiàn)全局異常處理類
- SpringBoot常用注解@RestControllerAdvice詳解
- SpringBoot?@RestControllerAdvice注解對返回值統(tǒng)一封裝的處理方法
- springboot @Controller和@RestController的區(qū)別及應(yīng)用詳解
- SpringBoot http請求注解@RestController原理解析
- springboot中@RestController注解實(shí)現(xiàn)
相關(guān)文章
Spring?Security權(quán)限管理小結(jié)
SpringSecurity是一個權(quán)限管理框架,核心是認(rèn)證和授權(quán),前面已經(jīng)系統(tǒng)的給大家介紹過了認(rèn)證的實(shí)現(xiàn)和源碼分析,本文重點(diǎn)來介紹下權(quán)限管理,需要的朋友可以參考下2022-08-08通過Java創(chuàng)建Socket連接到服務(wù)器方式
這篇文章主要介紹了通過Java創(chuàng)建Socket連接到服務(wù)器方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11spring cloud升級到spring boot 2.x/Finchley.RELEASE遇到的坑
這篇文章主要介紹了spring cloud升級到spring boot 2.x/Finchley.RELEASE遇到的坑,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-08