天天看點

springboot統一處理傳回實體與異常抛出

springboot統一處理傳回實體與異常抛出

當傳回異常時,是這樣子的

{
    "timestamp": "2019-12-11T05:37:10.096+0000",
    "status": 500,
    "error": "Internal Server Error",
    "message": "報錯了",
    "path": "/test/testException"
}      

但是,可能有時前台需要一個code值來判斷抛出的錯誤,這樣就需要我們封裝去傳回code值和message值。同時還可以攔截異常進行輸出,是市面架構的通用做法。下文将介紹如何統一處理傳回實體與異常抛出。

1.自定義傳回對象

1.定義一個傳回實體類,如果不進行處理,直接輸出200和成功碼。在接口輸出最外層都使用該實體,這樣前端就能有規範的擷取資料與資訊值。

public enum CommonEnum {

    SC_SUCCESS(200, "成功"),

    SC_NO_JURISDICTION(401, "沒有權限,請聯系管理者授權"),

    SC_INTERNAL_SERVER_ERROR_500(500, "接口異常");

}

public class Result<T> implements Serializable {

    /**
     * 傳回編碼
     */
    private Integer code = 200;

    /**
     * 傳回資訊
     */
    private String message = "操作成功";

    /**
     * 傳回資料
     */
    private T data;

    /**
     * 成功标志
     */
    private boolean success = true;

    public Result() {
    }

    public Result(Integer code, String Message) {
        this.code = code;
        this.message = Message;
    }

    public int getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMessage() {
        return this.message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public void SetResult(Integer code, String msg, T data) {
        this.setMessage(msg);
        this.setData(data);
        this.setCode(code);
    }

    public static Result<Object> error(String msg) {
        return error(CommonEnum.SC_INTERNAL_SERVER_ERROR_500.getCode(), msg);
    }

    public static Result<Object> error(int code, String msg) {
        Result<Object> r = new Result<Object>();
        r.setCode(code);
        r.setMessage(msg);
        return r;
    }
}      

2.異常的統一處理

  1. 自定義一個TemplateException ,需要繼承Exception (或其他子類)。
public class TemplateException extends Exception {

    /**
     * 伺服器狀态碼
     */
    private Integer code;

    /**
     * 錯誤資訊
     */
    private String message;

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    @Override
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public TemplateException(String message) {
        this.message = message;
    }

    public TemplateException(Integer code, String message) {
        this.message = message;
        this.code = code;
    }
}      
  1. 定義一個ExceptionHandle,在異常時會進行邏輯處理。是以不需要在寫try-catch了,直接在該類配置即可。
@RestControllerAdvice
public class DemoExceptionHandler {

    private final static Logger logger = LoggerFactory.getLogger(DemoExceptionHandler.class);

    /**
     * 自定義異常處理
     *
     * @param e
     * @return
     */
    @ExceptionHandler(TemplateException.class)
    public Result<?> handleTemplateException(TemplateException e) {
        logger.info(e.getMessage());
        e.printStackTrace();
        return Result.error(e.getCode(), e.getMessage());
    }

    /**
     * exception異常處理
     *
     * @param e
     * @return
     */
    @ExceptionHandler(Exception.class)
    public Result<?> handleException(Exception e) {
        logger.info(e.getMessage());
        e.printStackTrace();
        return Result.error("接口異常,錯誤資訊為" + e.getMessage());
    }

    /**
     * 權限異常
     *
     * @param e
     * @return
     */
    @ExceptionHandler({UnauthorizedException.class, AuthorizationException.class})
    public Result<?> handleAuthorizationException(AuthorizationException e) {
        logger.info(e.getMessage());
        e.printStackTrace();
        return Result.error(CommonEnum.SC_NO_JURISDICTION.getCode(), CommonEnum.SC_NO_JURISDICTION.getMessage());
    }
}      

這時候在抛出異常時,傳回值為 。

{
    "code": 10066,
    "status": 0,
    "msg": "報錯了",
    "data": null
}