中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

SpringBoot怎么返回統一的JSON標準格式

發布時間:2021-08-14 20:57:18 來源:億速云 閱讀:192 作者:chen 欄目:開發技術

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

期望返回的JSON格式如下

{
  "code": 200,
  "msg": "操作成功",
  "data": "hello jenkins"
}

實現步驟如下

1.自定義狀態碼枚舉類。

@AllArgsConstructor
@Getter
public enum StatusCodeEnum {
    SC200(200, "操作成功"),
    SC999(999, "操作失敗"),
    SC401(401, "匿名用戶訪問權限資源時的異常"),
    SC403(403, "無訪問權限,請聯系管理員授予權限"),
    SC404(404, "請求的資源不存在"),
    SC500(500, "系統異常,請稍后重試"),
    // ...略
    private final Integer code;
    private final String msg;
}

2.封裝返回結果

@Data
public class ApiResult<T> implements Serializable {
    private Integer code;
    private String msg;
    private T data;

    public static <T> ApiResult<T> success(T data) {
        return ApiResult.success(StatusCodeEnum.SC200.getMsg(), data);
    }

    public static <T> ApiResult<T> success(String msg, T data) {
        ApiResult<T> apiResult = new ApiResult<>();
        apiResult.setCode(StatusCodeEnum.SC200.getCode());
        apiResult.setMsg(msg);
        apiResult.setData(data);
        return apiResult;
    }

    public static <T> ApiResult<T> fail(Integer code, String msg) {
        ApiResult<T> apiResult = new ApiResult<>();
        apiResult.setCode(code);
        apiResult.setMsg(msg);
        return apiResult;
    }

}

3.全局異常捕獲處理,使用@RestControllerAdvice注解。


@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
    /**
     * 捕獲其他異常
     */
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ExceptionHandler(Exception.class)
    public ApiResult<String> handle(Exception e) {
        log.error("全局異常信息:{}", e.getMessage());
        return ApiResult.fail(StatusCodeEnum.SC500.getCode(), StatusCodeEnum.SC500.getMsg());
    }
}
注解功能
@RestControllerAdviceRestController的增強類,可用于實現全局異常處理器
@ExceptionHandler統一處理某一類異常,從而減少代碼重復率和復雜度,比如要獲取自定義異常可以@ExceptionHandler(BusinessException.class)
@ResponseStatus指定客戶端收到的http狀態碼

注:請求進來 會按照 filter -> interceptor -> controllerAdvice -> aspect -> controller的順序調用,
404異常(NoHandlerFoundException)是無法通過這種方式捕獲的,因為在Filter層發生的異常都會到Spring默認的異常處理。如果你在配置文件配置了server.error.path的話,就會使用你配置的異常處理地址,如果沒有就會使用你配置的error.path路徑地址,如果還是沒有,默認使用/error來作為發生異常的處理地址。如果想要替換默認的非Controller異常處理直接實現Spring提供的ErrorController接口就行了。

4.攔截Controller方法的返回值,統一處理返回值/響應體,因為我們后面每寫一個接口都需要調用ApiResult.success()這行代碼對結果進行包裝,重復勞動,浪費體力,我們只需要實現SpringBoot提供的ResponseBodyAdvice接口即可。

@RestControllerAdvice
public class ApiResultWrapper implements ResponseBodyAdvice<Object> {
    /**
     * 是否支持advice功能
     */
    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
        return true;
    }

    /**
     * 對返回的數據進行處理
     */
    @Override
    public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
        if (o instanceof String) {
            return JSON.toJSONString(ApiResult.success(o));
        }
        // 這個判斷的作用:防止全局異常處理后返回的結果(類型為ApiResult)再次被包裝
        if (o instanceof ApiResult) {
            return o;
        }
        return ApiResult.success(o);
    }

}

5.創建Controller,定義兩個方法,讓第二個方法拋異常

@RestController
public class TestController {
    @GetMapping("/test1")
    public String test1() {
        return "當前時間:" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    }

    @GetMapping("/test2")
    public Integer test2() {
        System.out.println(1 / 0);
        return Integer.MAX_VALUE;
    }
}

6.分別請求http://localhost:8080/test1、http://localhost:8080/test2,結果如下

SpringBoot怎么返回統一的JSON標準格式SpringBoot怎么返回統一的JSON標準格式

在全局異常處理類中寫了一行代碼

log.error("全局異常信息:{}", e.getMessage());

所以調用test2方法時控制臺打印異常信息如下

SpringBoot怎么返回統一的JSON標準格式

“SpringBoot怎么返回統一的JSON標準格式”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

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

AI

贡觉县| 大悟县| 上杭县| 射阳县| 盐边县| 竹山县| 抚远县| 中西区| 子洲县| 临沂市| 东阳市| 治多县| 彭泽县| 科技| 宣城市| 洪洞县| 封开县| 镶黄旗| 周宁县| 绥阳县| 东乡族自治县| 平果县| 区。| 花莲县| 荃湾区| 西贡区| 淳化县| 剑河县| 永福县| 南丰县| 龙泉市| 临夏市| 文山县| 湘乡市| 石城县| 宁河县| 佛山市| 全南县| 昌吉市| 青州市| 阿合奇县|