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

springboot實(shí)現(xiàn)全局異常處理的方法(住家飯系統(tǒng))

 更新時(shí)間:2025年05月06日 10:22:56   作者:小小奶酪可笑可笑  
住家飯系統(tǒng)將異常類型分為客戶端異常(ClientException),系統(tǒng)異常(ServiceException),遠(yuǎn)程調(diào)用異常(RemoteException),本文給大家介紹springboot實(shí)現(xiàn)全局異常處理的方法,感興趣的朋友一起看看吧

在實(shí)際項(xiàng)目開發(fā)中,定義全局異常處理至關(guān)重要通過全局異常處理器(使@ControllerAdvice@ExceptionHandler注解),可以集中捕獲和處理各種異常,避免在每個(gè)控制器方法中重復(fù)編寫異常處理代碼。

住家飯系統(tǒng)將異常類型分為客戶端異常(ClientException),系統(tǒng)異常(ServiceException),遠(yuǎn)程調(diào)用異常(RemoteException)。類結(jié)構(gòu)圖如下:

我們需先定義一個(gè)抽象異常類 AbstractException ,該抽象類繼承自 RuntimeException 類,通過該類約束異常類行為。

/**
 * 抽象項(xiàng)目中的三類異常,客戶端異常、服務(wù)端異常和遠(yuǎn)程服務(wù)調(diào)用異常
 */
@Data
public abstract class AbstractException extends RuntimeException{
    public final String errorCode;
    public final String errorMsg;
    public AbstractException(String errorMsg, Throwable throwable, IErrorCode errorCode) {
        super(errorMsg, throwable);
        this.errorCode = errorCode.code();
        this.errorMsg = Optional.ofNullable(StringUtils.hasLength(errorMsg) ? errorMsg : null).orElse(errorCode.msg());
    }
}

接著在分別定義客戶端異常、服務(wù)端異常和遠(yuǎn)程調(diào)用異常類。

public class ClientException extends AbstractException{
    public ClientException (IErrorCode errorCode) {
        super(null, null, errorCode);
    }
    public ClientException(IErrorCode errorCode, String errorMsg) {
        super(errorMsg, null, errorCode);
    }
    public ClientException(String message, Throwable throwable, IErrorCode errorCode) {
        super(message, throwable, errorCode);
    }
    @Override
    public String toString() {
        return "ClientException{" +
                "code='" + errorCode + "'," +
                "message='" + errorMsg + "'" +
                '}';
    }
}
public class ServiceException extends AbstractException{
    public ServiceException(String message) {
        this(message, null, BaseErrorCode.SERVICE_ERROR);
    }
    public ServiceException(IErrorCode errorCode) {
        this(null, errorCode);
    }
    public ServiceException(String message, IErrorCode errorCode) {
        this(message, null, errorCode);
    }
    public ServiceException(String message, Throwable throwable, IErrorCode errorCode) {
        super(Optional.ofNullable(message).orElse(errorCode.msg()), throwable, errorCode);
    }
    @Override
    public String toString() {
        return "ServiceException{" +
                "code='" + errorCode + "'," +
                "message='" + errorMsg + "'" +
                '}';
    }
}
public class RemoteException extends AbstractException{
    public RemoteException(String errorMsg, Throwable throwable, IErrorCode errorCode) {
        super(errorMsg, throwable, errorCode);
    }
    @Override
    public String toString() {
        return "RemoteException{" +
                "code='" + errorCode + "'," +
                "message='" + errorMsg + "'" +
                '}';
    }
}

這樣,我們就完成了對(duì)三大基本異常類的定義。接下來我們需要通過springboot提供的@ControllerAdvice@ExceptionHandler注解來實(shí)現(xiàn)全局異常攔截并處理。我們需定義一個(gè)GlobalExceptionHandler類,在該類中分別對(duì)參數(shù)驗(yàn)證異常、應(yīng)用內(nèi)拋出的異常和最頂級(jí)的Throwable異常進(jìn)行處理。

Component("globalExceptionHandlerByAdmin")
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
    /**
     * 攔截參數(shù)驗(yàn)證異常
     */
    @SneakyThrows
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public Result validExceptionHandler(HttpServletRequest request, MethodArgumentNotValidException ex) {
        BindingResult bindingResult = ex.getBindingResult();
        FieldError firstFieldError = CollectionUtil.getFirst(bindingResult.getFieldErrors());
        String exceptionStr = Optional.ofNullable(firstFieldError)
                .map(FieldError::getDefaultMessage)
                .orElse(StrUtil.EMPTY);
        log.error("[{}] {} [ex] {}", request.getMethod(), getUrl(request), exceptionStr);
        return Results.failure(BaseErrorCode.CLIENT_ERROR.code(), exceptionStr);
    }
    /**
     * 攔截應(yīng)用內(nèi)拋出的異常
     */
    @ExceptionHandler(value = {AbstractException.class})
    public Result abstractException(HttpServletRequest request, AbstractException ex) {
        if (ex.getCause() != null) {
            log.error("[{}] {} [ex] {}", request.getMethod(), request.getRequestURL().toString(), ex.toString(), ex.getCause());
            return Results.failure(ex);
        }
        log.error("[{}] {} [ex] {}", request.getMethod(), request.getRequestURL().toString(), ex.toString());
        return Results.failure(ex);
    }
    /**
     * 攔截未捕獲異常
     */
    @ExceptionHandler(value = Throwable.class)
    public Result defaultErrorHandler(HttpServletRequest request, Throwable throwable) {
        log.error("[{}] {} ", request.getMethod(), getUrl(request), throwable);
        if (Objects.equals(throwable.getClass().getSuperclass().getSimpleName(), AbstractException.class.getSimpleName())) {
            String errorCode = ReflectUtil.getFieldValue(throwable, "errorCode").toString();
            String errorMessage = ReflectUtil.getFieldValue(throwable, "errorMessage").toString();
            return Results.failure(errorCode, errorMessage);
        }
        return Results.failure();
    }
    private String getUrl(HttpServletRequest request) {
        if (StringUtils.isEmpty(request.getQueryString())) {
            return request.getRequestURL().toString();
        }
        return request.getRequestURL().toString() + "?" + request.getQueryString();
    }
}

今后,我們?cè)陧?xiàng)目里拋出的所有異常,都可以被 GlobalExceptionHandler 類捕獲并進(jìn)行相應(yīng)的處理。

    public void register(UserRegisterReqDTO requestParam) {
        if(ObjectUtils.isEmpty(requestParam)) throw new ClientException(CLIENT_ERROR);
        if (hasUserName(requestParam.getUsername())) {
            throw new ServiceException(USER_NAME_EXIST);
        }
        try {
            int inserted = baseMapper.insert(BeanUtil.toBean(requestParam, UserDao.class));
            if (inserted <= 0) {
                throw new ClientException(USER_SAVE_ERROR);
            }
        }  catch (DuplicateKeyException ex) {
            throw new ServiceException(USER_EXIST);
        }
    }

到此這篇關(guān)于springboot實(shí)現(xiàn)全局異常處理的文章就介紹到這了,更多相關(guān)springboot全局異常處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 新聞列表的分頁查詢java代碼實(shí)現(xiàn)

    新聞列表的分頁查詢java代碼實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了新聞列表的分頁查詢java代碼實(shí)現(xiàn),感興趣的小伙伴們可以參考一下
    2016-08-08
  • SpringBoot用ServiceLocatorFactoryBean優(yōu)雅切換支付渠道

    SpringBoot用ServiceLocatorFactoryBean優(yōu)雅切換支付渠道

    本文主要介紹了SpringBoot用ServiceLocatorFactoryBean優(yōu)雅切換支付渠道,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-10-10
  • SpringBoot模板引擎之Thymeleaf的使用

    SpringBoot模板引擎之Thymeleaf的使用

    這篇文章主要介紹了SpringBoot模板引擎之Thymeleaf的使用,模板引擎是以業(yè)務(wù)邏輯層和表現(xiàn)層分離為目的的,將規(guī)定格式的模板代碼轉(zhuǎn)換為業(yè)務(wù)數(shù)據(jù)的算法實(shí)現(xiàn),它可以是一個(gè)過程代碼、一個(gè)類,甚至是一個(gè)類庫,需要的朋友可以參考下
    2023-10-10
  • Spring?Boot教程之必須了解的核心概念

    Spring?Boot教程之必須了解的核心概念

    這篇文章主要介紹了Spring?Boot系列教程中的關(guān)于學(xué)習(xí)Spring?Boot必須了解的核心概念的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • java 教你如何給你的頭像添加一個(gè)好看的國旗

    java 教你如何給你的頭像添加一個(gè)好看的國旗

    這篇文章主要介紹了java 教你如何給你的頭像添加一個(gè)好看的國旗,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • JAVA緩存的使用RedisCache、LocalCache、復(fù)合緩存的操作

    JAVA緩存的使用RedisCache、LocalCache、復(fù)合緩存的操作

    RedisCache是基于Redis的緩存,數(shù)據(jù)存儲(chǔ)在內(nèi)存中,并且可以被多個(gè)應(yīng)用實(shí)例共享,屬于分布式緩存,本文給大家介紹JAVA緩存的使用RedisCache、LocalCache、復(fù)合緩存的相關(guān)操作,感興趣的朋友跟隨小編一起看看吧
    2026-02-02
  • java的MybatisPlus調(diào)用儲(chǔ)存過程的返回?cái)?shù)據(jù)問題

    java的MybatisPlus調(diào)用儲(chǔ)存過程的返回?cái)?shù)據(jù)問題

    這篇文章主要介紹了java的MybatisPlus調(diào)用儲(chǔ)存過程的返回?cái)?shù)據(jù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Spring Boot2.x如何自定義Endpoint

    Spring Boot2.x如何自定義Endpoint

    這篇文章主要介紹了Spring Boot2.x如何自定義Endpoint,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 如何避免在Java?中使用雙括號(hào)初始化

    如何避免在Java?中使用雙括號(hào)初始化

    這篇文章主要介紹了如何避免在Java中使用雙括號(hào)初始化,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • SpringBoot生成條形碼的方案詳解

    SpringBoot生成條形碼的方案詳解

    在Spring Boot, Spring Cloud 項(xiàng)目中整合ZXing庫來生成條形碼在特定行業(yè)也是一個(gè)常見需求,ZXing是google開源的一個(gè)功能強(qiáng)大的Java庫,專門用于二維碼/條形碼等的生成與解析,所以本文給大家介紹了SpringBoot生成條形碼的方案,需要的朋友可以參考下
    2024-08-08

最新評(píng)論

洛川县| 稻城县| 建水县| 开原市| 海宁市| 马山县| 长汀县| 江油市| 广昌县| 界首市| 赞皇县| 永登县| 八宿县| 诸城市| 永修县| 启东市| 大厂| 镇宁| 湛江市| 肇东市| 渭南市| 安福县| 紫阳县| 渝中区| 富民县| 开原市| 德阳市| 襄垣县| 罗田县| 林口县| 四川省| 杭锦旗| 恩施市| 横山县| 武宣县| 明星| 红原县| 湖州市| 湘乡市| 扎囊县| 河北省|