一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 基于@RestControllerAdvice與@ControllerAdvice的區別說明

基于@RestControllerAdvice與@ControllerAdvice的區別說明

2022-01-18 18:24y_bccl27 Java教程

這篇文章主要介紹了@RestControllerAdvice與@ControllerAdvice的區別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

@RestControllerAdvice與@ControllerAdvice的區別

@RestControllerAdvice注解與@ControllerAdvice注解位于同一個依賴包下面,其pom依賴為:

?
1
2
3
4
5
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.3.3</version>
</dependency>

有時會發現在不同的項目中,全局異常處理部分,有的自定義類添加@RestControllerAdvice注解,有的自定義類添加@ControllerAdvice注解。

其實這兩個注解的作用基本上是一致的,都是為了實現自定義全局異常處理,

唯一的區別是:@RestControllerAdvice注解包含了@ControllerAdvice注解和@ResponseBody注解。

@ControllerAdvice注解的源碼為

?
1
2
3
4
5
6
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface ControllerAdvice {
}

@RestControllerAdvice注解的源碼為

?
1
2
3
4
5
6
7
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@ControllerAdvice
@ResponseBody
public @interface RestControllerAdvice {
}

當自定義類加@ControllerAdvice注解時,方法需要返回json數據時,每個方法還需要添加@ResponseBody注解

當自定義類加@RestControllerAdvice注解時,方法自動返回json數據,每個方法無需再添加@ResponseBody注解

?
1
2
3
4
5
6
7
8
9
10
11
12
13
/**
 * 全局異常處理類
 */
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
 
 @ExceptionHandler(Exception.class)
 public Result<String> ExceptionHandler(Exception e) {
  log.error("出現異常:", e);
  return Result.failed(e.getMessage());
 }
}

@RestControllerAdvice @ControllerAdvice注解無效 通用異常處理

簡單記錄下,今天打算寫一個公共異常處理切面,主要是將所有拋出的異常攔截,然后返回給前端的時候,統一是錯誤碼,錯誤原因等。防止直接在前端拋出錯誤。

@RestControllerAdvice 或者 @ControllerAdvice 可以直接作為錯誤處理的切面對待。但是使用過程中發現這兩個注解無效,原因是我將GlobalExceptionHandler定義在另一個包里面,@SpringBootApplication無法自動加載到該注解(springboot啟動類的默認掃描路徑是該類所在的包下面的所有java類。

如:啟動類在“com.galen.cloud.portal”包下,那么只有com.galen.cloud.portal包下的類會被掃描加載)。所以添加上對應的scanBasePackages 即可(我這邊改為掃描所有匹配com.galen.*的包):

啟動類

?
1
2
3
4
5
6
7
8
9
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);
    }
}

錯誤處理類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
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());
    /**
     * 請求方式不支持
     */
    @ExceptionHandler({HttpRequestMethodNotSupportedException.class})
    @ResponseStatus(code = HttpStatus.METHOD_NOT_ALLOWED)
    public R handleException(HttpRequestMethodNotSupportedException e)
    {
        logger.error(e.getMessage(), e);
        return R.error("不支持' " + e.getMethod() + "'請求");
    }
    /**
     * 攔截未知的運行時異常
     */
    @ExceptionHandler(RuntimeException.class)
    public R notFount(RuntimeException e)
    {
        if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null)
        {
            throw e;
        }
        logger.error("運行時異常:", e);
        return R.error("運行時異常:" + 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("數據庫中已存在該記錄");
    }
    @ExceptionHandler(Exception.class)
    public R handleException(Exception e) throws Exception
    {
        logger.error(e.getMessage(), e);
        return R.error("服務器錯誤,請聯系管理員");
    }
    /**
     * 捕獲并處理未授權異常
     *
     * @param e 授權異常
     * @return 統一封裝的結果類, 含有代碼code和提示信息msg
     */
    @ExceptionHandler(UnauthorizedException.class)
    public R handle401(UnauthorizedException e)
    {
        return R.error(401, e.getMessage());
    }
    // 驗證碼錯誤
    @ExceptionHandler(ValidateCodeException.class)
    public R handleCaptcha(ValidateCodeException e)
    {
        return R.error(e.getMessage());
    }
}

最后攔截效果圖如下:

基于@RestControllerAdvice與@ControllerAdvice的區別說明

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/y_bccl27/article/details/120219882

延伸 · 閱讀

精彩推薦
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
主站蜘蛛池模板: 青青草伊人久久 | 柔术一级毛片 | v视界影院_vsjla | 白丝尤物的下面被疯狂蹂躏 | 国语自产拍在线观看7m | 天天做天天爱天天一爽一毛片 | 国内交换一区二区三区 | www.伊人| 香蕉国产人午夜视频在线 | 免费黄色小说 | 极品91 | 70岁多老妇人特黄a级毛片 | 天天色踪合 | 免费国产在线观看 | 亚洲精品国产精品麻豆99 | 韩日一区二区三区 | 加勒比一本大道在线 | 欧美添下面视频免费观看 | 亚洲国产精品无圣光一区二区 | 香蕉精品高清在线观看视频 | 亚洲精品国产国语 | 99re最新网址| 四虎最新免费观看网址 | 日韩精品一区二区三区中文版 | 国产三级自拍视频 | 99热r| 免费刷10000名片赞网站 | 羞羞答答免费人成黄页在线观看国产 | 美女被无套进入 | 亚洲H成年动漫在线观看不卡 | 国产精品视频第一区二区 | 丝瓜视频成人在线观看 | 国产香蕉视频在线观看 | 国产精品久久久久无毒 | 亚洲日本va中文字幕 | 青青草一区二区免费精品 | 美女被绑着吸下部的故事 | 222aaa精品影院| 色综合色狠狠天天综合色hd | 东北老女人91p0rny | a4yy欧美一区二区三区 |