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

SpringBoot中@RestControllerAdvice @ExceptionHandler異常統(tǒng)一處理類(lèi)失效原因分析

 更新時(shí)間:2024年01月23日 17:01:02   作者:MLJ.  
這篇文章主要介紹了SpringBoot中@RestControllerAdvice @ExceptionHandler異常統(tǒng)一處理類(lèi)失效原因,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

項(xiàng)目原來(lái)的處理方式

在我的項(xiàng)目中,我原本只使用了 @ExceptionHandler 注解,并通過(guò)繼承的方式實(shí)現(xiàn)了統(tǒng)一異常處理。

我創(chuàng)建了一個(gè)名為 BaseController 的父類(lèi),其中包含了以下代碼:

public class BaseController {
 
    @ExceptionHandler(Exception.class)
    public RestResult handleException(Throwable e) {
        //定義異常處理的響應(yīng)數(shù)據(jù)模型
        RestResult result = new RestResult();
        result.setSuccess(false);
        result.setData(e.getMessage());
        result.setErrorCode(500);
        e.printStackTrace();
        return result;
    }
}

然后,我讓項(xiàng)目中需要統(tǒng)一異常管理的 @Controller 類(lèi)都繼承了 BaseController。

例如,我有一個(gè)名為 UserController 的控制器:

@RequestMapping("/user")
public class UserController extends BaseController {
    ···
}

通過(guò)這種方式,我成功實(shí)現(xiàn)了統(tǒng)一異常處理,但是這種方法需要讓所有的 @Controller 類(lèi)都繼承BaseController,有些繁瑣。

使用@RestControllerAdvice和@ExceptionHandler組合

后來(lái),我在網(wǎng)上找到了使用 @RestControllerAdvice 和 @ExceptionHandler 組合的方法。

我創(chuàng)建了一個(gè)名為 GlobalExceptionHandler 的類(lèi),其中包含了以下代碼:

@RestControllerAdvice
public class GlobalExceptionHandler {
 
    @ExceptionHandler(Exception.class)
    public RestResult handleException(Throwable e) {
        //定義異常處理的響應(yīng)數(shù)據(jù)模型
        RestResult result = new RestResult();
        result.setSuccess(false);
        result.setData(e.getMessage());
        result.setErrorCode(500);
        e.printStackTrace();
        return result;
    }
}

遇到的問(wèn)題描述

起初,我以為這種方法不會(huì)有什么問(wèn)題。但是在測(cè)試過(guò)程中,我發(fā)現(xiàn)統(tǒng)一處理異常的方法一直沒(méi)有被調(diào)用,即使我嘗試了很多方法也沒(méi)有解決。

直到我看到一個(gè)帖子提到,被 @RestControllerAdvice 標(biāo)注的類(lèi)必須單獨(dú)放到一個(gè)文件夾中,我半信半疑地創(chuàng)建了一個(gè)名為 "a" 的文件夾,并將 GlobalExceptionHandler 類(lèi)放進(jìn)去后重新測(cè)試。

令我沒(méi)想到的是,異常發(fā)生時(shí)確實(shí)跳轉(zhuǎn)到了統(tǒng)一處理的方法中。

然后,我又將文件夾的名字改為 "exceptionHandler" 后重新測(cè)試,結(jié)果又無(wú)法跳轉(zhuǎn)到統(tǒng)一處理的方法中。

此時(shí)我已經(jīng)發(fā)現(xiàn)了問(wèn)題所在。由于我將控制器代碼放在了名為 "controller" 的文件夾中,一開(kāi)始我將 "GlobalExceptionHandler" 類(lèi)放到名為 "a"的文件夾,它在 "controller" 的首字母 "c" 上面;后來(lái)我我將 "GlobalExceptionHandler" 類(lèi)放到以 "e" 開(kāi)頭的文件夾,它在 "controller" 的首字母 "c" 下面。

因此,這可能是由于 Spring Bean 加載順序的問(wèn)題。

解決

只需要在GlobalExceptionHandler類(lèi)中添加@Order注解,以確保它優(yōu)先加載就沒(méi)問(wèn)題了。

@Order(9999)
@RestControllerAdvice
public class GlobalExceptionHandler {
 
    @ExceptionHandler(Exception.class)
    public RestResult handleException(Throwable e) {
        //定義異常處理的響應(yīng)數(shù)據(jù)模型
        RestResult result = new RestResult();
        result.setSuccess(false);
        result.setData(e.getMessage());
        result.setErrorCode(500);
        e.printStackTrace();
        return result;
    }
}

添加了 @Order 注解后,重新進(jìn)行測(cè)試,問(wèn)題就得到了解決。

總結(jié)

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

相關(guān)文章

  • 使用ShardingSphere-Proxy實(shí)現(xiàn)分表分庫(kù)

    使用ShardingSphere-Proxy實(shí)現(xiàn)分表分庫(kù)

    這篇文章介紹了使用ShardingSphere-Proxy實(shí)現(xiàn)分表分庫(kù)的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • 最新評(píng)論

    永安市| 汉寿县| 紫阳县| 屯门区| 泸州市| 泸定县| 永寿县| 麻栗坡县| 驻马店市| 宁海县| 鹤壁市| 泰顺县| 托里县| 梨树县| 昌黎县| 鹤岗市| 旬邑县| 嘉兴市| 中卫市| 湘西| 峨山| 尼勒克县| 龙岩市| 泊头市| 邯郸县| 宜都市| 哈巴河县| 建瓯市| 荣昌县| 屏东市| 镇沅| 枣庄市| 惠东县| 晴隆县| 碌曲县| 徐闻县| 新乡市| 金乡县| 玛纳斯县| 图木舒克市| 屯留县|