最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于@RestControllerAdvice與@ControllerAdvice的區(qū)別說明

 更新時(shí)間:2021年09月25日 15:12:47   作者:y_bccl27  
這篇文章主要介紹了@RestControllerAdvice與@ControllerAdvice的區(qū)別說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

@RestControllerAdvice與@ControllerAdvice的區(qū)別

@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注解。

@ControllerAdvice注解的源碼為

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface ControllerAdvice { 
}

@RestControllerAdvice注解的源碼為

@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è)方法無需再添加@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());
 }
}

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

簡(jiǎn)單記錄下,今天打算寫一個(gè)公共異常處理切面,主要是將所有拋出的異常攔截,然后返回給前端的時(shí)候,統(tǒng)一是錯(cuò)誤碼,錯(cuò)誤原因等。防止直接在前端拋出錯(cuò)誤。

@RestControllerAdvice 或者 @ControllerAdvice 可以直接作為錯(cuò)誤處理的切面對(duì)待。但是使用過程中發(fā)現(xiàn)這兩個(gè)注解無效,原因是我將GlobalExceptionHandler定義在另一個(gè)包里面,@SpringBootApplication無法自動(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.*的包):

啟動(dòng)類

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);
    }
}

錯(cuò)誤處理類

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());
    }
}

最后攔截效果圖如下:

在這里插入圖片描述

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 微服務(wù)間調(diào)用Retrofit在Spring?Cloud?Alibaba中的使用

    微服務(wù)間調(diào)用Retrofit在Spring?Cloud?Alibaba中的使用

    這篇文章主要為大家介紹了微服務(wù)間調(diào)用Retrofit在Spring?Cloud?Alibaba中的使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 一文搞懂Java中的序列化與反序列化

    一文搞懂Java中的序列化與反序列化

    序列化是將對(duì)象轉(zhuǎn)換成二進(jìn)制字節(jié)流的過程;反序列化是從二進(jìn)制字節(jié)流中恢復(fù)對(duì)象的過程。文中降通過示例詳解二者的使用與區(qū)別,需要的可以參考一下
    2022-08-08
  • 詳細(xì)聊聊JDK中的反模式接口常量

    詳細(xì)聊聊JDK中的反模式接口常量

    這篇文章主要給大家介紹了關(guān)于JDK中反模式接口常量的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用jdk具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-01-01
  • Spring MVC溫故而知新系列教程之從零開始

    Spring MVC溫故而知新系列教程之從零開始

    Spring MVC 框架在 Java 的 Web 項(xiàng)目中應(yīng)該是無人不知的吧,你不會(huì)搭建一個(gè) Spring 框架?作為身為一個(gè)剛剛學(xué)習(xí)Java的我都會(huì),如果你不會(huì)的話,那可真令人憂傷。下面這篇文章主要給大家介紹了關(guān)于Spring MVC從零開始的相關(guān)資料,需要的朋友可以參考下
    2018-05-05
  • Mybatis-flex整合達(dá)夢(mèng)數(shù)據(jù)庫(kù)的實(shí)現(xiàn)示例

    Mybatis-flex整合達(dá)夢(mèng)數(shù)據(jù)庫(kù)的實(shí)現(xiàn)示例

    本文討論了國(guó)產(chǎn)達(dá)夢(mèng)數(shù)據(jù)庫(kù)與Mybatis-flex框架的整合過程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10
  • 基于Mybatis-Plus的CRUD的實(shí)現(xiàn)

    基于Mybatis-Plus的CRUD的實(shí)現(xiàn)

    這篇文章主要介紹了基于Mybatis-Plus的CRUD的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • spring?boot自動(dòng)裝配之@ComponentScan注解用法詳解

    spring?boot自動(dòng)裝配之@ComponentScan注解用法詳解

    @ComponentScan的作用就是根據(jù)定義的掃描路徑,把符合掃描規(guī)則的類裝配到spring容器中,下面這篇文章主要給大家介紹了關(guān)于spring?boot自動(dòng)裝配之@ComponentScan注解用法的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • SpringBoot如何通過devtools實(shí)現(xiàn)熱部署

    SpringBoot如何通過devtools實(shí)現(xiàn)熱部署

    這篇文章主要介紹了SpringBoot如何通過devtools實(shí)現(xiàn)熱部署,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 詳解基于IDEA2020.1的JAVA代碼提示插件開發(fā)例子

    詳解基于IDEA2020.1的JAVA代碼提示插件開發(fā)例子

    這篇文章主要介紹了詳解基于IDEA2020.1的JAVA代碼提示插件開發(fā)例子,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Java基礎(chǔ)教程之String深度分析

    Java基礎(chǔ)教程之String深度分析

    這篇文章主要給大家介紹了關(guān)于Java基礎(chǔ)教程之String的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06

最新評(píng)論

商城县| 新闻| 柘荣县| 西乡县| 湟中县| 吐鲁番市| 大城县| 澄城县| 江津市| 萝北县| 永昌县| 新野县| 响水县| 新巴尔虎右旗| 贵溪市| 南召县| 海南省| 张掖市| 安平县| 山西省| 肇源县| 宁国市| 固安县| 廊坊市| 高阳县| 岑巩县| 南昌县| 桃园县| 宝坻区| 沙坪坝区| 淮北市| 永宁县| 开平市| 宝应县| 永平县| 衡南县| 讷河市| 景洪市| 翁源县| 翁牛特旗| 漯河市|