亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringBoot中@RestControllerAdvice 全局異常處理的實現(xiàn)

 更新時間:2025年06月18日 10:37:50   作者:Muscleheng  
本文主要介紹了SpringBoot中@RestControllerAdvice 全局異常處理的實現(xiàn),通過定義統(tǒng)一響應(yīng)格式、自定義異常類及測試驗證,確保接口異常時返回指定格式的提示信息,提升錯誤處理一致性

利用注解@RestControllerAdvice 輕輕松松實現(xiàn)全局異常處理

一、定義統(tǒng)一響應(yīng)體

package com.zhh.demo.common.response;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;

/**
 * @Description: 接口出參統(tǒng)一響應(yīng)實體
 * @Author: zhaoheng
 * @CreateTime: 2022-08-05  16:27
 */
@Data
@ApiModel("接口出參統(tǒng)一響應(yīng)實體")
public class Response<T> implements Serializable {
    private static final long serialVersionUID = 3692286106860121474L;

    @ApiModelProperty(value = "狀態(tài)碼")
    private String code;

    @ApiModelProperty(value = "說明")
    private String message;

    private T data;

    public Response(){}

    public Response(String code, String message) {
        this.code = code;
        this.message = message;
    }

    public Response(String code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }
}
package com.zhh.demo.common.response;

import lombok.Getter;

/**
 * @Description: 統(tǒng)一響應(yīng)code和說明
 * @Author: zhaoheng
 * @CreateTime: 2022-08-05  16:42
 */
public enum ResponseCode {

    /** 通用碼 **/
    FAIL("-1", "系統(tǒng)錯誤"),
    OK("200", "成功"),

    /**
     * 參考阿里巴巴開發(fā)手冊
     * 錯誤碼為字符串類型,共5位,分兩部分組成:錯誤標(biāo)識+4位數(shù)字編號。
     * 例:A0001,A1001,B0001,C0001... A、B、分別代表不通業(yè)務(wù)或者來源
     **/

    /** 參數(shù)校驗不通過 **/
    PARAMETER_CHECK_FAILS("A0001","參數(shù)校驗不通過"),

    /** 用戶相關(guān) A1xxx **/
    USER_NAME_NONSTANDARD("A1002", "用戶名不合規(guī)");

    ResponseCode(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    @Getter
    private String code;

    @Getter
    private String msg;
}
package com.zhh.demo.common.response;

import com.zhh.demo.entity.common.ResponsePage;

import java.util.List;

/**
 * @Description: 接口統(tǒng)一響應(yīng)實體構(gòu)造類
 * @Author: zhaoheng
 * @CreateTime: 2022-08-05  16:37
 */
public class ResponseFactory {

    /**
     * 默認(rèn)成功
     * @param t
     * @param <T>
     * @return
     */
    public static <T> Response<T> success(T t){
       return new Response<T>(ResponseCode.OK.getCode(),ResponseCode.OK.getMsg(),t);
    }

    /**
     * 成功
     * @param responseCode  響應(yīng)code和說明
     * @param t
     * @param <T>
     * @return
     */
    public static <T> Response<T> success(ResponseCode responseCode, T t){
        return new Response<T>(responseCode.getCode(),responseCode.getMsg(),t);
    }

    /**
     * 成功
     * @param responseCode  響應(yīng)code和說明
     * @return
     */
    public static <T> Response<T> success(ResponseCode responseCode){
        return new Response<T>(responseCode.getCode(),responseCode.getMsg());
    }

    /**
     * 默認(rèn)失敗
     * @param <T>
     * @return
     */
    public static <T> Response<T> error(){
        return new Response<T>(ResponseCode.FAIL.getCode(),ResponseCode.FAIL.getMsg());
    }

    /**
     * 失敗
     * @param responseCode  響應(yīng)code和說明
     * @param t
     * @param <T>
     * @return
     */
    public static <T> Response<T> error(ResponseCode responseCode, T t){
        return new Response<T>(responseCode.getCode(),responseCode.getMsg(),t);
    }

    /**
     * 失敗
     * @param responseCode  響應(yīng)code和說明
     * @return
     */
    public static <T> Response<T> error(ResponseCode responseCode){
        return new Response<T>(responseCode.getCode(),responseCode.getMsg());
    }

    /**
     * 失敗
     * @param code  錯誤碼
     * @param msg   說明
     * @param t     響應(yīng)數(shù)據(jù)
     * @param <T>
     * @return
     */
    public static <T> Response<T> error(String code, String msg, T t){
        return new Response<T>(code,msg,t);
    }

    /**
     * 失敗
     * @param code  錯誤碼
     * @param msg   說明
     * @return
     */
    public static <T> Response<T> error(String code, String msg){
        return new Response<T>(code,msg);
    }

    public static <T> ResponsePage pageResult(List<T> list, int total){
        return new ResponsePage<T>(list,total);
    }

}

二、定義全局異常處理類

package com.zhh.demo.common.exception;

import com.zhh.demo.common.response.Response;
import com.zhh.demo.common.response.ResponseCode;
import com.zhh.demo.common.response.ResponseFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.List;

/**
 * @Description: 全局異常處理
 * @Author: zhaoheng
 * @CreateTime: 2022-08-05  17:33
 */
@Slf4j
@RestControllerAdvice
public class ExceptionHandle {

    /**
     * 處理Exception異常
     * @param exception 異常類型
     * @return
     */
    @ExceptionHandler(value = Exception.class)
    public Response<?> ExceptionHandle(Exception exception){
        log.error("系統(tǒng)出現(xiàn)異常:",exception);
        return ResponseFactory.error(ResponseCode.FAIL);
    }

    /**
     * 處理業(yè)務(wù)異常
     * @param exception 異常類型
     * @return
     */
    @ExceptionHandler(value = BaseException.class)
    public Response<?> BaseExceptionHandle(BaseExceptionexception){
        log.error("系統(tǒng)業(yè)務(wù)異常:",exception);
        return ResponseFactory.error(exception.getCode(),exception.getMsg());
    }

    /**
     * 入?yún)⑿r灝惓?,校驗不通過,拋出異常信息
     * @param exception Valid 入?yún)⑿r灝惓?
     * @return
     */
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public Response<?> methodArgumentNotValidExceptionHandle(MethodArgumentNotValidException exception){
        log.error("入?yún)⑿r灢煌ㄟ^",exception);
        BindingResult bindingResult = exception.getBindingResult();
        List<FieldError> fieldErrorList = bindingResult.getFieldErrors();
        fieldErrorList.forEach(fieldError -> {
            log.info("字段:{},message:{}",fieldError.getField(),fieldError.getDefaultMessage());
        });
        // 一個一個給調(diào)用方返回提示
        String message = fieldErrorList.get(0).getDefaultMessage();
        return ResponseFactory.error(ResponseCode.PARAMETER_CHECK_FAILS.getCode(), message);
    }

}

自定義異常

package com.zhh.demo.common.exception;

import com.zhh.demo.common.response.Response;
import com.zhh.demo.common.response.ResponseCode;
import lombok.Data;

/**
 * @Description: 異常基類
 * @Author: zhaoheng
 * @CreateTime: 2022-08-05  17:22
 */
@Data
public abstract class BaseException extends RuntimeException{

    /**
     * code碼
     */
    private String code;

    /**
     * 異常說明
     */
    private String msg;

    /**
     * 響應(yīng)體
     */
    private Response response;

    public BaseException(String code, String msg) {
        super(msg);
        this.code = code;
        this.msg = msg;
        this.response = new Response(code,msg);
    }

    public BaseException(ResponseCode responseCode) {
        super(responseCode.getMsg());
        this.code = responseCode.getCode();
        this.msg = responseCode.getMsg();
        this.response = new Response(responseCode.getCode(),responseCode.getMsg());
    }
}

三、編寫接口測試效果

package com.zhh.demo.controller;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;


@Api(tags = "test-api")
@RequestMapping("/api/test")
@RestController
@Validated // 開啟入?yún)⑿r?
public class TestController {
    
    @ApiOperation("異常測試")
    @PostMapping("/t1")
    public String test(){
        // 模擬異常
        new ArrayList<>().get(1);
        return "";
    }
}

經(jīng)過測試,接口拋出異常后會被異常處理類處理,并且給調(diào)用端返回指定格式的提示信息

{
  "code": "-1",
  "message": "系統(tǒng)錯誤",
  "data": null
}

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

相關(guān)文章

  • 持久層ORM框架Hibernate框架的使用及搭建方式

    持久層ORM框架Hibernate框架的使用及搭建方式

    Hibernate是一個開放源代碼的對象關(guān)系映射框架,它對JDBC進(jìn)行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數(shù)據(jù)庫,本文重點給大家介紹持久層ORM框架Hibernate框架的使用及搭建方式,感興趣的朋友一起看看吧
    2021-11-11
  • Springboot初始化啟動報錯Error?creating?bean?with?name?'dataSource'?defined?in?class?path?resource

    Springboot初始化啟動報錯Error?creating?bean?with?name?'da

    這篇文章主要為大家介紹了Springboot初始化啟動報Error?creating?bean?with?name?'dataSource'?defined?in?class?path?resource解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • java中final修飾符的使用方法

    java中final修飾符的使用方法

    這篇文章主要為大家詳細(xì)介紹了java中final修飾符的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Struts2學(xué)習(xí)手冊之文件上傳基礎(chǔ)教程

    Struts2學(xué)習(xí)手冊之文件上傳基礎(chǔ)教程

    Struts2提供的文件上傳下載機(jī)制十分簡便,使得我們寫很少的代碼,下面這篇文章主要給大家介紹了關(guān)于Struts2學(xué)習(xí)手冊之文件上傳的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-05-05
  • JVM內(nèi)存結(jié)構(gòu)相關(guān)知識解析

    JVM內(nèi)存結(jié)構(gòu)相關(guān)知識解析

    這篇文章主要介紹了JVM內(nèi)存結(jié)構(gòu)相關(guān)知識解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • java測試框架的方法

    java測試框架的方法

    這篇文章主要介紹了java測試框架的方法,文中代碼非常詳細(xì),供大家學(xué)習(xí)和參考,感興趣的朋友可以了解下
    2020-06-06
  • 教你用java完美封裝微信模板消息的發(fā)送動態(tài)

    教你用java完美封裝微信模板消息的發(fā)送動態(tài)

    這篇文章主要介紹了教你用java完美封裝微信模板消息的發(fā)送動態(tài),文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-04-04
  • 一小時迅速入門Mybatis之實體類別名與多參數(shù) 動態(tài)SQL

    一小時迅速入門Mybatis之實體類別名與多參數(shù) 動態(tài)SQL

    這篇文章主要介紹了一小時迅速入門Mybatis之實體類別名與多參數(shù) 動態(tài)SQL,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • Java編寫猜數(shù)字小游戲

    Java編寫猜數(shù)字小游戲

    這篇文章主要為大家詳細(xì)介紹了Java編寫的猜數(shù)字小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2015-09-09
  • Mybatis resultType返回結(jié)果為null的問題排查方式

    Mybatis resultType返回結(jié)果為null的問題排查方式

    這篇文章主要介紹了Mybatis resultType返回結(jié)果為null的問題排查方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評論