1.返回的model
(1)api接口返回model封裝
package com.study.project.result;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import java.io.Serializable;
@Data
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class CallResult<T> implements Serializable {
//請求返回碼
private int code;
//請求返回的toast 的提示
private String message;
//錯誤的詳細信息 包括異常的詳細描述
private String desc;
//請求的返回實體(正常返回的時候纔會返回)
private T result;
//構造方法
public CallResult() {
}
public CallResult(int code, String message, T result) {
this.code = code;
this.message = message;
this.result = result;
}
public CallResult(int code, String message,String desc ,T result) {
this.code = code;
this.message = message;
this.desc = desc;
this.result = result;
}
/**
* success 方法
* @param <T>
* @return
*/
public static <T>CallResult<T> success(){
return new CallResult(BusinessCodeEnum.DEFAULT_SUCCESS.getCode(),BusinessCodeEnum.DEFAULT_SUCCESS.getMsg(),null);
}
public static <T>CallResult<T> success(T result){
return new CallResult(BusinessCodeEnum.DEFAULT_SUCCESS.getCode(),BusinessCodeEnum.DEFAULT_SUCCESS.getMsg(),result);
}
/**
* fail
* @param <T>
* @return
*/
public static <T> CallResult<T> fail() {
return new CallResult(BusinessCodeEnum.DEFAULT_SYS_ERROR.getCode(), BusinessCodeEnum.DEFAULT_SYS_ERROR.getMsg(), (Object)null);
}
public static <T> CallResult<T> fail(T result) {
return new CallResult(BusinessCodeEnum.DEFAULT_SYS_ERROR.getCode(), BusinessCodeEnum.DEFAULT_SYS_ERROR.getMsg(), result);
}
public static <T> CallResult<T> fail(int code, String message , String desc) {
return new CallResult(code, message,desc,(Object) null);
}
public boolean isSuccess() {
return this.code == BusinessCodeEnum.DEFAULT_SUCCESS.getCode();
}
}
com.fasterxml.jackson.annotation.JsonInclude; 返回實體中有null 將被過濾掉
(2)返回code 碼封裝
code 枚舉2 000 000 000 枚舉代碼共 10 位 ,後三位代表業務(參數校驗,系統錯誤,業務異常等),中間三位代表不同的微服務名稱,最前面三位可以代表業務線。這段代碼codeMap 設計還是很精巧的,static 靜態代碼塊包裹,保證了這段代碼只被初始化一次,map 容量初始化不會浪費多餘空間
package com.study.project.result;
import java.util.HashMap;
import java.util.Map;
public enum BusinessCodeEnum {
DEFAULT_SUCCESS(2000000000, "default success"),
DEFAULT_SYS_ERROR(2000000999, "系統錯誤"),
CHECK_PARAM_NO_RESULT(2000000100, "檢測參數無結果"),
CHECK_BIZ_NO_RESULT(2000000101, "檢查業務無結果"),
CHECK_ACTION_NO_RESULT(2000000102, "檢查執行情況無結果");
private static final Map<Integer, BusinessCodeEnum> codeMap = new HashMap((int)((double)values().length / 0.75D) + 1);
private int code;
private String msg;
public static BusinessCodeEnum valueOfCode(int code) {
return (BusinessCodeEnum)codeMap.get(code);
}
private BusinessCodeEnum(int code, String msg) {
this.code = code;
this.msg = msg;
}
public int getCode() {
return this.code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return this.msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
static {
BusinessCodeEnum[] var0 = values();
int var1 = var0.length;
for(int var2 = 0; var2 < var1; ++var2) {
BusinessCodeEnum businessCodeEnum = var0[var2];
codeMap.put(businessCodeEnum.getCode(), businessCodeEnum);
}
}
public static void main(String[] args) {
System.out.println(codeMap.get(BusinessCodeEnum.CHECK_ACTION_NO_RESULT.getCode()).getMsg());
}
}
2.接口的訪問控制
對於接口訪問控制我的個人任務要分清服務,業務,接口版本,方法
所以
api class 上註解應該是 @RequstMapping("/服務名/業務名")
api method 上的註解應該是 @RequestMapping("/版本號/方法名")
當然尋址直接可以用自己寫的
3.異常處理
此處參考java代碼整潔之道(一)_不斷code review後的感想 中的短路式寫法
if (user == null){
throw new ServiceException("code","erroMsg","desc");
}
這樣的寫法好處就是,不會到處的try catch 又能及時的阻斷業務進程 ServiceException 參考java代碼整潔之道(二)如何自定義異常
再接口統一異常處理參考:jjava代碼整潔之道(五) 創建一個統一處理異常的切面