天天看點

Springboot三部曲之Controller統一傳回ResponseData<T>

在使用

Springboot

作為工程選型技術的時候,由于其三大特性的自動裝配,使得我們把注意力更多的放在功能代碼實作上,同時也對代碼的編寫品質提出了更高的要求,這裡所說的品質,說的是編碼規範。接下來的我會分為三個步驟去了解整個編碼基礎建構的要點,

Controller

統一傳回、

Controller

請求AOP日志管理、

Controller

統一異常處理。

為什麼需要統一傳回資料?如果你和你的同時合作過,他來開發後端接口,你來開發前端界面,我想在互動的時候,你會有多麼期待統一傳回,這會讓你的請求變得無比得清秀。下面是一些非統一傳回得執行個體:

@RestController
@RequestMapping("example")
public class ExampleController {

    @GetMapping("str")
    public String str() {
        return "Result Type is String";
    }

    @GetMapping("map")
    @ResponseBody
    public Map<String, Object> map() {
        Map<String, Object> hashMap = new HashMap<>(1);
        hashMap.put("Result", "Map");
        return hashMap;
    }

    @PostMapping("none")
    public void none() {
        System.out.println("none");
    }


}           

無論是什麼請求,後端人員要是按照自己得喜好或者便利去傳回對應得資料,對于前端得請求來說是災難性得,對前端來說相當不友好。

下面是統一傳回實力:

@RestController
@RequestMapping("gua")
public class GuaController {
    @GetMapping("str")
    public ResponseData str() {
        return ResponseDataUtil.buildSuccess("Result String");
    }

    @GetMapping("data")
    public ResponseData data() {
        return ResponseDataUtil.buildSuccess(new User());
    }


    @GetMapping("map")
    public ResponseData map() {
        HashMap<String, Object> map = new HashMap<>(1);
        map.put("Result", "Map");
        return ResponseDataUtil.buildSuccess(map);
    }


}
           

結果:

{"code":"0000","msg":"Result String","data":null}
{"code":"0000","msg":"請求成功","data":{"name":"DongGua","age":18}}
{"code":"0000","msg":"請求成功","data":{"Result":"Map"}}           

前端童鞋可以通過code得約定來處理結果。同樣得後端同學也可一寫出更加簡潔易懂得代碼。

ResponseData

作為統一傳回得實體,由

ResponseData

作為容器把消息傳回。其結構也超級簡單,需要三個元件:

ResponseData

ResponseDataUtils

ResultEnum

下面分别給出其結構:

ResponseData

public class ResponseData<T> implements Serializable {

    private String code;

    private String msg;

    private T data;


    public ResponseData(String code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

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

    public ResponseData(ResultEnums resultEnums) {
        this.code = resultEnums.getCode();
        this.msg = resultEnums.getMsg();
    }

    public ResponseData(ResultEnums resultEnums, T data) {
        this.code = resultEnums.getCode();
        this.msg = resultEnums.getMsg();
        this.data = data;
    }

    public ResponseData() {
    }

    public String getCode() {
        return code;
    }

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

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

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

ResponsDataUtils

public class ResponseDataUtil {
    /**
     * 帶實體的統一傳回
     *
     * @param data 實體
     * @param <T>  實體類型
     * @return
     */
    public static <T> ResponseData buildSuccess(T data) {
        return new ResponseData<T>(ResultEnums.SUCCESS, data);
    }

    public static ResponseData buildSuccess() {
        return new ResponseData(ResultEnums.SUCCESS);
    }

    public static ResponseData buildSuccess(String msg) {
        return new ResponseData(ResultEnums.SUCCESS.getCode(), msg);
    }

    public static ResponseData buildSuccess(String code, String msg) {
        return new ResponseData(code, msg);
    }

    public static <T> ResponseData buildSuccess(String code, String msg, T data) {
        return new ResponseData<T>(code, msg, data);
    }

    public static ResponseData buildSuccess(ResultEnums resultEnums) {
        return new ResponseData(resultEnums);
    }

    public static <T> ResponseData buildError(T data) {
        return new ResponseData<T>(ResultEnums.ERROR, data);
    }

    public static ResponseData buildError() {
        return new ResponseData(ResultEnums.ERROR);
    }

    public static ResponseData buildError(String msg) {
        return new ResponseData(ResultEnums.ERROR.getCode(), msg);
    }

    public static ResponseData buildError(String code, String msg) {
        return new ResponseData(code, msg);
    }

    public static <T> ResponseData buildError(String code, String msg, T data) {
        return new ResponseData<T>(code, msg, data);
    }

    public static ResponseData buildError(ResultEnums resultEnums) {
        return new ResponseData(resultEnums);
    }
}           

ResultEnum

public enum ResultEnums {

    SUCCESS("0000", "請求成功"),
    ERROR("1111", "請求失敗"),
    SYSTEM_ERROR("1000", "系統異常"),
    BUSSINESS_ERROR("2001", "業務邏輯錯誤"),
    VERIFY_CODE_ERROR("2002", "業務參數錯誤"),
    PARAM_ERROR("2002", "業務參數錯誤");

    private String code;
    private String msg;

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

    public String getCode() {
        return code;
    }

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

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}           

controller

的統一傳回實作很簡單,但是作用去很大,喜歡的小夥伴可以試着改造以一下自己的工程喲。明天見。