您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)@RestControllerAdvice與@ControllerAdvice的區(qū)別是什么,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
@RestControllerAdvice注解與@ControllerAdvice注解位于同一個(gè)依賴包下面,其pom依賴為:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.3.3</version> </dependency>
有時(shí)會(huì)發(fā)現(xiàn)在不同的項(xiàng)目中,全局異常處理部分,有的自定義類添加@RestControllerAdvice注解,有的自定義類添加@ControllerAdvice注解。
其實(shí)這兩個(gè)注解的作用基本上是一致的,都是為了實(shí)現(xiàn)自定義全局異常處理,
唯一的區(qū)別是:@RestControllerAdvice注解包含了@ControllerAdvice注解和@ResponseBody注解。
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface ControllerAdvice { }
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @ControllerAdvice @ResponseBody public @interface RestControllerAdvice { }
當(dāng)自定義類加@ControllerAdvice注解時(shí),方法需要返回json數(shù)據(jù)時(shí),每個(gè)方法還需要添加@ResponseBody注解
當(dāng)自定義類加@RestControllerAdvice注解時(shí),方法自動(dòng)返回json數(shù)據(jù),每個(gè)方法無(wú)需再添加@ResponseBody注解
/** * 全局異常處理類 */ @RestControllerAdvice @Slf4j public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public Result<String> ExceptionHandler(Exception e) { log.error("出現(xiàn)異常:", e); return Result.failed(e.getMessage()); } }
簡(jiǎn)單記錄下,今天打算寫一個(gè)公共異常處理切面,主要是將所有拋出的異常攔截,然后返回給前端的時(shí)候,統(tǒng)一是錯(cuò)誤碼,錯(cuò)誤原因等。防止直接在前端拋出錯(cuò)誤。
@RestControllerAdvice 或者 @ControllerAdvice 可以直接作為錯(cuò)誤處理的切面對(duì)待。但是使用過(guò)程中發(fā)現(xiàn)這兩個(gè)注解無(wú)效,原因是我將GlobalExceptionHandler定義在另一個(gè)包里面,@SpringBootApplication無(wú)法自動(dòng)加載到該注解(springboot啟動(dòng)類的默認(rèn)掃描路徑是該類所在的包下面的所有java類。
如:?jiǎn)?dòng)類在“com.galen.cloud.portal”包下,那么只有com.galen.cloud.portal包下的類會(huì)被掃描加載)。所以添加上對(duì)應(yīng)的scanBasePackages 即可(我這邊改為掃描所有匹配com.galen.*的包):
package com.galen.cloud.portal; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication(scanBasePackages = "com.galen.*") public class galenPortalApplication { public static void main(String[] args) { SpringApplication.run(galenPortalApplication.class, args); } }
package com.galen.common.exception; import com.galen.common.core.domain.R; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.annotation.AnnotationUtils; import org.springframework.dao.DuplicateKeyException; import org.springframework.http.HttpStatus; import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice; /** * 異常處理器 * @author galen */ @RestControllerAdvice public class GlobalExceptionHandler { private Logger logger = LoggerFactory.getLogger(getClass()); /** * 請(qǐng)求方式不支持 */ @ExceptionHandler({HttpRequestMethodNotSupportedException.class}) @ResponseStatus(code = HttpStatus.METHOD_NOT_ALLOWED) public R handleException(HttpRequestMethodNotSupportedException e) { logger.error(e.getMessage(), e); return R.error("不支持' " + e.getMethod() + "'請(qǐng)求"); } /** * 攔截未知的運(yùn)行時(shí)異常 */ @ExceptionHandler(RuntimeException.class) public R notFount(RuntimeException e) { if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null) { throw e; } logger.error("運(yùn)行時(shí)異常:", e); return R.error("運(yùn)行時(shí)異常:" + e.getMessage()); } /** * 處理自定義異常 */ @ExceptionHandler(galenException.class) public R handleWindException(galenException e) { return R.error(e.getCode(), e.getMessage()); } @ExceptionHandler(DuplicateKeyException.class) public R handleDuplicateKeyException(DuplicateKeyException e) { logger.error(e.getMessage(), e); return R.error("數(shù)據(jù)庫(kù)中已存在該記錄"); } @ExceptionHandler(Exception.class) public R handleException(Exception e) throws Exception { logger.error(e.getMessage(), e); return R.error("服務(wù)器錯(cuò)誤,請(qǐng)聯(lián)系管理員"); } /** * 捕獲并處理未授權(quán)異常 * * @param e 授權(quán)異常 * @return 統(tǒng)一封裝的結(jié)果類, 含有代碼code和提示信息msg */ @ExceptionHandler(UnauthorizedException.class) public R handle401(UnauthorizedException e) { return R.error(401, e.getMessage()); } // 驗(yàn)證碼錯(cuò)誤 @ExceptionHandler(ValidateCodeException.class) public R handleCaptcha(ValidateCodeException e) { return R.error(e.getMessage()); } }
最后攔截效果圖如下:
關(guān)于@RestControllerAdvice與@ControllerAdvice的區(qū)別是什么就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。