国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SpringBoot中@ControllerAdvice/@RestControlAdvice+@ExceptionHandler實(shí)現(xiàn)全局異常捕獲與處理

這篇具有很好參考價(jià)值的文章主要介紹了SpringBoot中@ControllerAdvice/@RestControlAdvice+@ExceptionHandler實(shí)現(xiàn)全局異常捕獲與處理。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

場(chǎng)景

在編寫(xiě)Controller接口時(shí),為避免接口因?yàn)槲粗漠惓?dǎo)致返回不友好的結(jié)果和提示。

如果不進(jìn)行全局異常捕獲則需要對(duì)每個(gè)接口進(jìn)行try-catch或其他操作。

SpringBoot中@ControllerAdvice/@RestControlAdvice+@ExceptionHandler實(shí)現(xiàn)全局異常捕獲與處理?

可以對(duì)Controller進(jìn)行全局的異常捕獲和處理,一旦發(fā)生異常,則返回通用的500響應(yīng)碼與通用錯(cuò)誤提示。

并將異常發(fā)生的具體的文件、類、方法、行數(shù)信息記錄到日志。

@ControllerAdvice,是Spring3.2提供的新注解,它是一個(gè)Controller增強(qiáng)器,

可對(duì)controller中被 @RequestMapping注解的方法加一些邏輯處理。最常用的就是異常處理。

需要配合@ExceptionHandler使用。當(dāng)將異常拋到controller時(shí),可以對(duì)異常進(jìn)行統(tǒng)一處理。

注:

博客:
霸道流氓氣質(zhì)的博客_CSDN博客-C#,架構(gòu)之路,SpringBoot領(lǐng)域博主

實(shí)現(xiàn)

1、@RestControlAdvice是組合注解,由@ControllerAdvice和@ResponseBody組成。

SpringBoot中@ControllerAdvice/@RestControlAdvice+@ExceptionHandler實(shí)現(xiàn)全局異常捕獲與處理?

@ControllerAdvice 提供了多種指定Advice規(guī)則的定義方式,默認(rèn)什么都不寫(xiě),則是Advice所有Controller,

SpringBoot中@ControllerAdvice/@RestControlAdvice+@ExceptionHandler實(shí)現(xiàn)全局異常捕獲與處理

?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-445640.html

當(dāng)然你也可以通過(guò)下列的方式指定規(guī)則。

通過(guò)basePackages指定只對(duì)哪些包路徑下生效。

也可以通過(guò)指定注解來(lái)匹配,比如我自定了一個(gè) @CustomAnnotation 注解,

我想匹配所有被這個(gè)注解修飾的 Controller, 可以這么寫(xiě):@ControllerAdvice(annotations= {CustomAnnotation.class})

這里不做任何規(guī)則限制,對(duì)所有的controller生效。

2、新建全局異常捕獲類,注意與啟動(dòng)類在同包路徑下,不然不生效需要在啟動(dòng)類中指定包路徑。

import com.badao.demo.common.AjaxResult;
import com.badao.demo.constant.Constants;
import com.badao.demo.constant.HttpStatus;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
//注意引入包的路徑
import org.springframework.validation.BindException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class GlobalExceptionHandler
{
??? private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);

??? @ExceptionHandler(Exception.class)
??? public AjaxResult handleException(Exception e)
??? {
??????? StackTraceElement stackTrace = e.getStackTrace()[0];
??????? String methodName = stackTrace.getMethodName();
??????? String fileName = stackTrace.getFileName();
??????? String className = stackTrace.getClassName();
??????? int lineNumber = stackTrace.getLineNumber();
??????? log.error("異常發(fā)生在文件{}的類{}中的方法{}的第{}行',異常信息:{}", fileName,className,methodName,lineNumber,e.getMessage());
??????? return AjaxResult.error(HttpStatus.ERROR, Constants.SERVER_ERROR);
??? }
}

這里使用@ExceptionHandler(Exception.class)

對(duì)所有的Exception進(jìn)行捕獲,然后統(tǒng)一返回封裝的AjaxResult結(jié)果類

import com.badao.demo.constant.HttpStatus;
import com.badao.demo.utils.StringUtils;

import java.util.HashMap;

/**
?* 操作消息提醒
?*
?*/
public class AjaxResult extends HashMap<String, Object>
{
??? private static final long serialVersionUID = 1L;

??? /** 狀態(tài)碼 */
??? public static final String CODE_TAG = "code";

??? /** 返回內(nèi)容 */
??? public static final String MSG_TAG = "msg";

??? /** 數(shù)據(jù)對(duì)象 */
??? public static final String DATA_TAG = "data";

??? /**
???? * 初始化一個(gè)新創(chuàng)建的 AjaxResult 對(duì)象,使其表示一個(gè)空消息。
???? */
??? public AjaxResult()
??? {
??? }

??? /**
???? * 初始化一個(gè)新創(chuàng)建的 AjaxResult 對(duì)象
???? *
???? * @param code 狀態(tài)碼
???? * @param msg 返回內(nèi)容
???? */
??? public AjaxResult(int code, String msg)
??? {
??????? super.put(CODE_TAG, code);
??????? super.put(MSG_TAG, msg);
??? }

??? /**
???? * 初始化一個(gè)新創(chuàng)建的 AjaxResult 對(duì)象
???? *
???? * @param code 狀態(tài)碼
???? * @param msg 返回內(nèi)容
???? * @param data 數(shù)據(jù)對(duì)象
???? */
??? public AjaxResult(int code, String msg, Object data)
??? {
??????? super.put(CODE_TAG, code);
??????? super.put(MSG_TAG, msg);
??????? if (StringUtils.isNotNull(data))
??????? {
??????????? super.put(DATA_TAG, data);
??????? }
??? }

??? /**
???? * 返回成功消息
???? *
???? * @return 成功消息
???? */
??? public static AjaxResult success()
??? {
??????? return AjaxResult.success("操作成功");
??? }

??? /**
???? * 返回成功數(shù)據(jù)
???? *
???? * @return 成功消息
???? */
??? public static AjaxResult success(Object data)
??? {
??????? return AjaxResult.success("操作成功", data);
??? }

??? /**
???? * 返回成功消息
???? *
???? * @param msg 返回內(nèi)容
???? * @return 成功消息
???? */
??? public static AjaxResult success(String msg)
??? {
??????? return AjaxResult.success(msg, null);
??? }

??? /**
???? * 返回成功消息
???? *
???? * @param msg 返回內(nèi)容
???? * @param data 數(shù)據(jù)對(duì)象
???? * @return 成功消息
???? */
??? public static AjaxResult success(String msg, Object data)
??? {
??????? return new AjaxResult(HttpStatus.SUCCESS, msg, data);
??? }

??? /**
???? * 返回錯(cuò)誤消息
???? *
???? * @return
???? */
??? public static AjaxResult error()
??? {
??????? return AjaxResult.error("操作失敗");
??? }

??? /**
???? * 返回錯(cuò)誤消息
???? *
???? * @param msg 返回內(nèi)容
???? * @return 警告消息
???? */
??? public static AjaxResult error(String msg)
??? {
??????? return AjaxResult.error(msg, null);
??? }

??? /**
???? * 返回錯(cuò)誤消息
???? *
???? * @param msg 返回內(nèi)容
???? * @param data 數(shù)據(jù)對(duì)象
???? * @return 警告消息
???? */
??? public static AjaxResult error(String msg, Object data)
??? {
??????? return new AjaxResult(HttpStatus.ERROR, msg, data);
??? }

??? /**
???? * 返回錯(cuò)誤消息
???? *
???? * @param code 狀態(tài)碼
???? * @param msg 返回內(nèi)容
???? * @return 警告消息
???? */
??? public static AjaxResult error(int code, String msg)
??? {
??????? return new AjaxResult(code, msg, null);
??? }
}

然后狀態(tài)碼和提示消息是封裝的常量類

狀態(tài)碼常量類

public class HttpStatus
{
??? /**
???? * 操作成功
???? */
??? public static final int SUCCESS = 200;

??? /**
???? * 對(duì)象創(chuàng)建成功
???? */
??? public static final int CREATED = 201;

??? /**
???? * 請(qǐng)求已經(jīng)被接受
???? */
??? public static final int ACCEPTED = 202;

??? /**
???? * 操作已經(jīng)執(zhí)行成功,但是沒(méi)有返回?cái)?shù)據(jù)
???? */
??? public static final int NO_CONTENT = 204;

??? /**
???? * 資源已被移除
???? */
??? public static final int MOVED_PERM = 301;

??? /**
???? * 重定向
???? */
??? public static final int SEE_OTHER = 303;

??? /**
???? * 資源沒(méi)有被修改
???? */
??? public static final int NOT_MODIFIED = 304;

??? /**
???? * 參數(shù)列表錯(cuò)誤(缺少,格式不匹配)
???? */
??? public static final int BAD_REQUEST = 400;

??? /**
???? * 未授權(quán)
???? */
??? public static final int UNAUTHORIZED = 401;

??? /**
???? * 訪問(wèn)受限,授權(quán)過(guò)期
???? */
??? public static final int FORBIDDEN = 403;

??? /**
???? * 資源,服務(wù)未找到
???? */
??? public static final int NOT_FOUND = 404;

??? /**
???? * 不允許的http方法
???? */
??? public static final int BAD_METHOD = 405;

??? /**
???? * 資源沖突,或者資源被鎖
???? */
??? public static final int CONFLICT = 409;

??? /**
???? * 不支持的數(shù)據(jù),媒體類型
???? */
??? public static final int UNSUPPORTED_TYPE = 415;

??? /**
???? * 系統(tǒng)內(nèi)部錯(cuò)誤
???? */
??? public static final int ERROR = 500;

??? /**
???? * 接口未實(shí)現(xiàn)
???? */
??? public static final int NOT_IMPLEMENTED = 501;
}

消息常量類

public class Constants {
??? //請(qǐng)求響應(yīng)常量
??? public static final String NO_API_CODE = "請(qǐng)求碼不能為空";
??? public static final String ILLEGAL_API_CODE = "請(qǐng)求碼不存在";
??? public static final String SERVER_ERROR = "服務(wù)器內(nèi)部錯(cuò)誤,請(qǐng)聯(lián)系管理員!";
??? public static final String CALL_TOO_OFEN = "請(qǐng)求太頻繁";
}

然后將異常發(fā)生的具體信息記錄到日志中,異常的信息來(lái)源可以打斷點(diǎn)獲取和自定義需要獲取的內(nèi)容

SpringBoot中@ControllerAdvice/@RestControlAdvice+@ExceptionHandler實(shí)現(xiàn)全局異常捕獲與處理

?

2、這里是對(duì)Exception類型進(jìn)行通配,如果需要對(duì)指定的異常類型或者自定義類型就行捕獲,還可以

import com.badao.demo.common.AjaxResult;
import com.badao.demo.constant.Constants;
import com.badao.demo.constant.HttpStatus;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
//注意引入包的路徑
import org.springframework.validation.BindException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class GlobalExceptionHandler
{
??? private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);

??? @ExceptionHandler(Exception.class)
??? public AjaxResult handleException(Exception e)
??? {
??????? StackTraceElement stackTrace = e.getStackTrace()[0];
??????? String methodName = stackTrace.getMethodName();
??????? String fileName = stackTrace.getFileName();
??????? String className = stackTrace.getClassName();
??????? int lineNumber = stackTrace.getLineNumber();
??????? log.error("異常發(fā)生在文件{}的類{}中的方法{}的第{}行',異常信息:{}", fileName,className,methodName,lineNumber,e.getMessage());
??????? return AjaxResult.error(HttpStatus.ERROR, Constants.SERVER_ERROR);
??? }

??? /**
???? * 自定義驗(yàn)證異常
???? */
??? @ExceptionHandler(BindException.class)
??? public AjaxResult handleBindException(BindException e) {
??????? log.error(e.getMessage(), e);
??????? String message = e.getAllErrors().get(0).getDefaultMessage();
??????? return AjaxResult.error(HttpStatus.BAD_REQUEST, message);
??? }

??? /**
???? * 自定義驗(yàn)證異常
???? */
??? @ExceptionHandler(MethodArgumentNotValidException.class)
??? public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException e)
??? {
??????? log.error(e.getMessage(), e);
??????? String message = e.getBindingResult().getFieldError().getDefaultMessage();
??????? return AjaxResult.error(message);
??? }
}

這里注意引入包的路徑,不然會(huì)出現(xiàn)不生效的情況。

這塊還可參考

SpringBoot+@Validate+全局異常攔截實(shí)現(xiàn)自定義規(guī)則參數(shù)校驗(yàn)(校驗(yàn)get請(qǐng)求參數(shù)不能為空且在指定枚舉類型中):

SpringBoot+@Validate+全局異常攔截實(shí)現(xiàn)自定義規(guī)則參數(shù)校驗(yàn)(校驗(yàn)get請(qǐng)求參數(shù)不能為空且在指定枚舉類型中)_霸道流氓氣質(zhì)的博客-CSDN博客

3、測(cè)試效果

手動(dòng)編寫(xiě)一個(gè)除零異常并將controller中的try-catch去掉

SpringBoot中@ControllerAdvice/@RestControlAdvice+@ExceptionHandler實(shí)現(xiàn)全局異常捕獲與處理

?

接口統(tǒng)一響應(yīng),在日志中記錄到具體信息

SpringBoot中@ControllerAdvice/@RestControlAdvice+@ExceptionHandler實(shí)現(xiàn)全局異常捕獲與處理

?

到了這里,關(guān)于SpringBoot中@ControllerAdvice/@RestControlAdvice+@ExceptionHandler實(shí)現(xiàn)全局異常捕獲與處理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Spring專題】「技術(shù)原理」從源碼角度去深入分析關(guān)于Spring的異常處理ExceptionHandler的實(shí)現(xiàn)原理

    【Spring專題】「技術(shù)原理」從源碼角度去深入分析關(guān)于Spring的異常處理ExceptionHandler的實(shí)現(xiàn)原理

    ExceptionHandler是Spring框架提供的一個(gè)注解,用于處理應(yīng)用程序中的異常。當(dāng)應(yīng)用程序中發(fā)生異常時(shí),ExceptionHandler將優(yōu)先地?cái)r截異常并處理它,然后將處理結(jié)果返回到前端。該注解可用于類級(jí)別和方法級(jí)別,以捕獲不同級(jí)別的異常。 在Spring中使用ExceptionHandler非常簡(jiǎn)單,只需在需

    2023年04月09日
    瀏覽(32)
  • @ControllerAdvice 注解使用及原理探究

    最近在新項(xiàng)目的開(kāi)發(fā)過(guò)程中,遇到了個(gè)問(wèn)題,需要將一些異常的業(yè)務(wù)流程返回給前端,需要提供給前端不同的響應(yīng)碼,前端再在次基礎(chǔ)上做提示語(yǔ)言的國(guó)際化適配。這些異常流程涉及業(yè)務(wù)層和控制層的各個(gè)地方,如果每個(gè)地方都寫(xiě)一些重復(fù)代碼顯得很冗余。 然后查詢解決方案

    2024年02月14日
    瀏覽(21)
  • @ControllerAdvice注解使用及原理探究 | 京東物流技術(shù)團(tuán)隊(duì)

    @ControllerAdvice注解使用及原理探究 | 京東物流技術(shù)團(tuán)隊(duì)

    最近在新項(xiàng)目的開(kāi)發(fā)過(guò)程中,遇到了個(gè)問(wèn)題,需要將一些異常的業(yè)務(wù)流程返回給前端,需要提供給前端不同的響應(yīng)碼,前端再在次基礎(chǔ)上做提示語(yǔ)言的國(guó)際化適配。這些異常流程涉及業(yè)務(wù)層和控制層的各個(gè)地方,如果每個(gè)地方都寫(xiě)一些重復(fù)代碼顯得很冗余。 然后查詢解決方案

    2024年02月14日
    瀏覽(22)
  • Caused by: java.lang.ClassNotFoundException: org.apache.maven.exception.ExceptionHandler 的解決辦法

    Caused by: java.lang.ClassNotFoundException: org.apache.maven.exception.ExceptionHandler 的解決辦法

    出現(xiàn)這個(gè)問(wèn)題,是由于開(kāi)發(fā)環(huán)境遷移,在遷移的過(guò)程中操作不規(guī)范導(dǎo)致的, 由一臺(tái)開(kāi)發(fā)服務(wù)器,遷移至另外一臺(tái)開(kāi)發(fā)服務(wù)器時(shí),啟動(dòng)失敗, 錯(cuò)誤提示:“? Exception in thread \\\"main\\\" java.lang.NoClassDefFoundError: org/apache/maven/exception/ExceptionHandler ” 具體內(nèi)容如下: ?如下圖: 關(guān)于這個(gè)

    2024年02月04日
    瀏覽(93)
  • 【Spring Boot統(tǒng)一功能處理】統(tǒng)一異常處理,統(tǒng)一的返回格式,@ControllerAdvice簡(jiǎn)單分析,即將走進(jìn)SSM項(xiàng)目的大門(mén)! ! !

    【Spring Boot統(tǒng)一功能處理】統(tǒng)一異常處理,統(tǒng)一的返回格式,@ControllerAdvice簡(jiǎn)單分析,即將走進(jìn)SSM項(xiàng)目的大門(mén)! ! !

    前言: 大家好,我是 良辰丫 ,在上一篇文章中我們已經(jīng)學(xué)習(xí)了一些統(tǒng)一功能處理的相關(guān)知識(shí),今天我們繼續(xù)深入學(xué)習(xí)這些知識(shí),主要學(xué)習(xí)統(tǒng)一異常處理,統(tǒng)一的返回格式,@ControllerAdvice簡(jiǎn)單分析.?????? ??個(gè)人主頁(yè):良辰針不戳 ??所屬專欄:javaEE進(jìn)階篇之框架學(xué)習(xí) ??勵(lì)志語(yǔ)句:生

    2024年02月16日
    瀏覽(35)
  • 【SpringBoot】springboot實(shí)現(xiàn)全局異常捕獲

    【SpringBoot】springboot實(shí)現(xiàn)全局異常捕獲

    為什么要做異常處理: 原因有三: 1、將系統(tǒng)產(chǎn)生的全部異常統(tǒng)一捕獲處理。 2、自定義異常需要由全局異常來(lái)捕獲。 3、JSR303規(guī)范的validator參數(shù)校驗(yàn)器、參數(shù)校驗(yàn)不通過(guò)、本身無(wú)法使用try…catch 其實(shí)對(duì)于前后端分離的項(xiàng)目做異常處理是很有必要的 在不出異常的情況下,后端

    2024年02月12日
    瀏覽(23)
  • 【SpringBoot】SpringBoot實(shí)現(xiàn)投票系統(tǒng)代碼

    由于投票系統(tǒng)的代碼量較大,且有很多細(xì)節(jié)需要注意,因此不能在這里完整地給出代碼。但是,下面是一個(gè)簡(jiǎn)單的SpringBoot投票系統(tǒng)的代碼框架,為您提供一個(gè)參考,您可以在此基礎(chǔ)上進(jìn)行開(kāi)發(fā)和完善。 創(chuàng)建一個(gè)名為\\\"VotingSystem\\\"的SpringBoot項(xiàng)目 在pom.xml文件中添加需要的依賴:

    2024年02月10日
    瀏覽(15)
  • SpringBoot進(jìn)階-SpringBoot如何實(shí)現(xiàn)配置文件脫敏

    SpringBoot進(jìn)階-SpringBoot如何實(shí)現(xiàn)配置文件脫敏

    SpringBoot進(jìn)階-SpringBoot如何實(shí)現(xiàn)配置文件脫敏? SpringBoot集成jasypt配置信息加密以及采坑 在很多開(kāi)發(fā)場(chǎng)景中我們的SpringBoot應(yīng)用是被打包成了一個(gè)Jar文件來(lái)使用的,利用解壓縮工具可以將這個(gè)Jar包解壓出來(lái)并且在對(duì)應(yīng)的配置路徑下找到數(shù)據(jù)庫(kù)的訪問(wèn)地址以及數(shù)據(jù)庫(kù)的登錄密碼等等

    2024年02月08日
    瀏覽(18)
  • 玩轉(zhuǎn)SpringBoot:SpringBoot的幾種定時(shí)任務(wù)實(shí)現(xiàn)方式

    在現(xiàn)代軟件開(kāi)發(fā)中,定時(shí)任務(wù)是一種常見(jiàn)的需求,用于執(zhí)行周期性的任務(wù)或在特定的時(shí)間點(diǎn)執(zhí)行任務(wù)。這些任務(wù)可能涉及數(shù)據(jù)同步、數(shù)據(jù)備份、報(bào)表生成、緩存刷新等方面,對(duì)系統(tǒng)的穩(wěn)定性和可靠性有著重要的影響。 Spring Boot 提供了強(qiáng)大且簡(jiǎn)單的定時(shí)任務(wù)功能,使開(kāi)發(fā)人員能

    2024年03月09日
    瀏覽(28)
  • 【SpringBoot】1、SpringBoot整合JWT實(shí)現(xiàn)Token驗(yàn)證

    【SpringBoot】1、SpringBoot整合JWT實(shí)現(xiàn)Token驗(yàn)證

    單點(diǎn)登錄(Single Sign On), 簡(jiǎn)稱為 SSO , 是目前比較流行的企業(yè)業(yè)務(wù)整合的解決方案之一. SSO的定義:在多個(gè)應(yīng)用系統(tǒng)中, 用戶只需要登錄一次就可以訪問(wèn)所有相互信任的應(yīng)用系統(tǒng), 企業(yè)間需要相互授信 眾所皆知, HTTP是 無(wú)狀態(tài)的協(xié)議 , 這意味著 服務(wù)器無(wú)法確認(rèn)用戶的信息。 于是乎,

    2024年02月03日
    瀏覽(31)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包