91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot全局異常處理的作用和用法

發布時間:2021-06-18 14:56:34 來源:億速云 閱讀:286 作者:chen 欄目:編程語言

本篇內容介紹了“SpringBoot全局異常處理的作用和用法”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

1、為什么要全局異常處理

在實際開發中,如果不處理統一處理異常,那么前端在調用后端提供的接口,就會處理各種的異常結構,對于前端來說那可謂是一場災難,這對前后端的協作也不友好。比如后端路徑:/api/v1/index/user?id=222,如果前端未傳入ID,那么SpringBoot就會報如下異常:

{"timestamp":"2021-03-30T15:22:46.139+00:00","status":400,"error":"Bad Request","message":"","path":"/api/v1/index/user"}

或者是我們代碼里面自定義異常throw new RuntimeException("用戶信息未找到!");,對于Spring Boot來說拋出如下異常:

{"timestamp":"2021-03-30T15:25:55.657+00:00","status":500,"error":"Internal Server Error","message":"","path":"/api/v1/index/users"}

而后端真的異常信息是用戶信息未找到!,前端獲取到500異常,完全不知后端的具體異常。基于這些就有必要全局統一處理異常。

2、實現全局異常處理

2.1 封裝統一結構消息

在實現全局異常處理之前,我們先封裝一個統一結構的消息對象。

  • 消息類

import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class RestResponse {
    private String code;
    private String message;
    private Object data;
}
  • 異常狀態枚舉

import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum ExceptionStatusEnums {
    OK("0","success"),
    ERROR("1","error");
    private String code;
    private String msg;
}
  • 處理消息的工廠類

import com.tenghu.lf.enums.ExceptionStatusEnums;
import com.tenghu.lf.resp.RestResponse;

public class ResponseFactory {
    private ResponseFactory(){

    }

    public static RestResponse getOkResponse(){
        return new RestResponse(ExceptionStatusEnums.OK.getCode(),ExceptionStatusEnums.OK.getMsg(),null);
    }

    public static RestResponse getOkResponse(String message){
        return new RestResponse(ExceptionStatusEnums.OK.getCode(),message,null);
    }

    public static RestResponse getOkResponse(Object data){
        return new RestResponse(ExceptionStatusEnums.OK.getCode(),ExceptionStatusEnums.OK.getMsg(),data);
    }

    public static RestResponse getOkResponse(String message,Object data){
        return new RestResponse(ExceptionStatusEnums.OK.getCode(),message,data);
    }

    public static RestResponse getErrorMessage(){
        return new RestResponse(ExceptionStatusEnums.ERROR.getCode(),ExceptionStatusEnums.ERROR.getMsg(),null);
    }

    public static RestResponse getErrorMessage(String message){
        return new RestResponse(ExceptionStatusEnums.ERROR.getCode(),message,null);
    }

    public static RestResponse getErrorMessage(String message,Object data){
        return new RestResponse(ExceptionStatusEnums.ERROR.getCode(),message,data);
    }

    public static RestResponse getBuildMessage(String code,String message){
        return new RestResponse(code,message,null);
    }

    public static RestResponse getBuildMessage(String code,String message,Object data){
        return new RestResponse(code,message,data);
    }
}

2.2 實現全局異常

定義一個全局異常處理類,在類上加上@RestControllerAdvice注解,也可以使用@ControllerAdvice注解,只不過使用后者,需要在各個方法上加上@ResponseBody注解

@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 處理自定義異常
     * @param componentException
     * @return
     */
    @ExceptionHandler(ComponentException.class)
    public RestResponse componentException(ComponentException componentException) {
        componentException.printStackTrace();
        return ResponseFactory.getBuildMessage(componentException.getCode(),componentException.getLocalizedMessage());
    }

    /**
     * 處理請求參數異常
     * @param e
     * @return
     */
    @ExceptionHandler(MissingServletRequestParameterException.class)
    public RestResponse paramMissingException(MissingServletRequestParameterException e){
        e.printStackTrace();
        return ResponseFactory.getBuildMessage(HttpStatus.INTERNAL_SERVER_ERROR.value()+"",String.format("請求參數:%s不能為空!",e.getParameterName()));
    }

    /**
     * 處理請求體異常
     * @param e
     * @return
     */
    @ExceptionHandler(HttpMessageNotReadableException.class)
    public RestResponse readableException(HttpMessageNotReadableException e){
        e.printStackTrace();
        return ResponseFactory.getBuildMessage(HttpStatus.INTERNAL_SERVER_ERROR.value()+"",String.format("請求參數體不能為空!%s",e.getLocalizedMessage()));
    }

    /**
     * 處理其他未知的運行時異常
     * @param runtimeException
     * @return
     */
    @ExceptionHandler(RuntimeException.class)
    public RestResponse runtimeException(RuntimeException runtimeException) {
        runtimeException.printStackTrace();
        return ResponseFactory.getBuildMessage(HttpStatus.INTERNAL_SERVER_ERROR.value()+"",runtimeException.getLocalizedMessage());
    }

    /**
     * 處理其他異常
     * @param exception
     * @return
     */
    @ExceptionHandler(Exception.class)
    public RestResponse otherException(Exception exception){
        exception.printStackTrace();
        return ResponseFactory.getErrorMessage(exception.getLocalizedMessage());
    }
}

3、測試

  • 訪問路徑/api/v1/index/user?name=小A,不傳name的情況下。

{
    "code": "500",
    "message": "請求參數:name不能為空!",
    "data": null
}
  • 訪問路徑/api/v1/index/user?name=小A,傳name的情況下。

{
    "code": "0",
    "message": "success",
    "data": {
        "id": "1111",
        "name": "小A"
    }
}
  • 訪問路徑/api/v1/index,不傳請求體。

{
    "code": "500",
    "message": "請求參數體不能為空!Required request body is missing: public com.tenghu.lf.resp.RestResponse com.tenghu.lf.controller.IndexController.save(com.tenghu.lf.entity.User)",
    "data": null
}
  • 訪問路徑/api/v1/index,傳請求體。

{
    "code": "0",
    "message": "success",
    "data": null
}

“SpringBoot全局異常處理的作用和用法”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沙坪坝区| 钟祥市| 黄骅市| 岳阳市| 项城市| 龙海市| 黄浦区| 万宁市| 东台市| 墨脱县| 汶上县| 彭水| 庆元县| 和政县| 义乌市| 万盛区| 辽宁省| 蕉岭县| 万山特区| 铁力市| 罗源县| 洛宁县| 铜鼓县| 阳信县| 绥滨县| 宁河县| 岗巴县| 玉林市| 婺源县| 深州市| 雷山县| 安福县| 密云县| 龙里县| 平阳县| 余庆县| 丰城市| 渭南市| 乌拉特后旗| 鲁山县| 丹棱县|