在使用 Springboot
作為工程選型技術的時候,由于其三大特性的自動裝配,使得我們把注意力更多的放在功能代碼實作上,同時也對代碼的編寫品質提出了更高的要求,這裡所說的品質,說的是編碼規範。接下來的我會分為三個步驟去了解整個編碼基礎建構的要點, Controller
統一傳回、 Controller
請求AOP日志管理、 Controller
統一異常處理。
Springboot
Controller
Controller
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
的統一傳回實作很簡單,但是作用去很大,喜歡的小夥伴可以試着改造以一下自己的工程喲。明天見。