本人目前在做的系統,尤其依賴另外一個系統,在調用另外一個系統時,可能會返回多種報錯,如下結構的錯誤:
/**
* 返回異常結果對象
*
* @return
*/
public ErrorBean resp(HttpServletResponse resp) {
if (null != resp) {
resp.setStatus(this.status);
}
return this.errorBean;
}
即會返回枚舉錯誤的status用來判斷是否異常,通過errorBean拿到錯誤,看一下errorBean的構造來源:
/**
* 缺少必要請求參數
*/
MISSING_REQUIRED_PARAMETERS(400, 10001, "missing_required_parameters", "缺少必要請求參數"),
/**
* 非法請求參數
*/
ILLEGAL_REQUEST_PARAMETER(400, 10002, "illegal_request_parameter", "非法請求參數"),
/**
* 請求URI不存在
*/
URI_NOT_EXIST(404, 10003, "uri_not_exist", "請求URI不存在"),
/**
* HTTP狀態碼
*/
private int status;
/**
* 異常信息對象
*/
private ErrorBean errorBean;
/**
* 異常描述
*/
public String desc;
/**
* 錯誤碼
*/
public int code;
private ErrorEnum(int status, int errCode, String errMsg, String desc) {
this.status = status;
this.errorBean = new ErrorBean(errCode, errMsg);
this.code = errCode;
this.desc = desc;
}
/**
* 異常信息對象
* @author
*
*/
public class ErrorBean implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 異常碼
*/
private int errCode;
/**
* 異常信息
*/
private String errMsg;
public ErrorBean() {}
public ErrorBean(int errCode, String errMsg) {
this.errCode = errCode;
this.errMsg = errMsg;
}
//get set 省略
@Override
public String toString() {
return "ErrorBean [errCode=" + errCode + ", errMsg=" + errMsg + "]";
}
}
以上也是我常用的異常返回定義,和下面的Result一起構造結果:
package com.xdja.pki.ca.core.common;
import java.io.Serializable;
/**
* 通用結果實體
*
* @author
*
*/
public class Result implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 執行結果 0-成功
*/
public final static int SUCCESS = 0;
/**
* 業務異常結果(兼容Service層直接返回業務異常枚舉情況)
*/
public final static int FAILURE = -1;
/**
* 執行結果
*/
private int code;
/**
* 業務數據
*/
private Object info;
/**
* 異常對象
*/
private ErrorEnum error;
/**
* 無參構造函數
*/
public Result() {}
/**
* 構造函數
*
* @param code 錯誤碼
* @param info 返回業務數據
*/
public Result(int code, Object info) {
this(code, info, null);
}
/**
* 構造函數
*
* @param code 執行結果代碼
* @param info 返回業務數據
* @param error 業務異常枚舉
*/
public Result(int code, Object info, ErrorEnum error) {
this.code = code;
this.info = info;
this.error = error;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public Object getInfo() {
return info;
}
public void setInfo(Object info) {
this.info = info;
}
public ErrorEnum getError() {
return error;
}
public void setError(ErrorEnum error) {
this.code = error.code;
this.error = error;
}
/**
* 是否執行成功
*
* @return
*/
public boolean isSuccess() {
return code == SUCCESS;
}
/**
* 構造成功返回結果
*
* @param info 業務數據
* @return 結果對象
*/
public static Result success(Object info) {
return new Result(SUCCESS, info);
}
/**
* 構造成功無業務數據返回結果
*
* @return 結果對象
*/
public static Result success() {
return new Result(SUCCESS, null);
}
/**
* 構造失敗返回結果
*
* @param code 錯誤碼
* @return 結果對象
*/
public static Result failure(int code) {
return new Result(code, null);
}
/**
* 構造失敗返回結果
*
* @param error 業務異常枚舉對象
* @return
*/
public static Result failure(ErrorEnum error) {
return new Result(FAILURE, null, error);
}
//等等 構造方法
@Override
public String toString() {
return "Result [code=" + code + ", info=" + info + ", error=" + error + "]";
}
}
但是當收到別的系統的錯誤碼 也就是errCode+errMsg,如何轉化成自己系統的錯誤碼呢?
在這裏我建議採取枚舉出所有code對應的錯誤枚舉,當然這要求兩個系統的錯誤碼不能相同。並且還可以改變爲更合理錯誤碼描述,例如:
/**
* 證書已經過期
*/
RA_CERT_ISSUE_STATUA_EXPIRED(400, 19025, "cert_has_expired", "CA返回證書已經過期"),
/**
* 證書狀態異常
*/
RA_CERT_ISSUE_STATUA_EXCEPTION(400, 19024, "cert_status_other", "CA返回證書狀態異常"),
//通過code獲取ErrorEnum
public static ErrorEnum getErrorEnumByCode(String errCode){
for(ErrorEnum errorEnum :values()){
if(StringUtils.equals(String.valueOf(errorEnum.code),errCode)){
return errorEnum;
}
}
return null;
}
調用getErrorEnumByCode方法,用code獲取對應的枚舉:
//錯誤碼
String failInfo = String.valueOf(info.getFailInfo().intValue());
ErrorEnum errorEnumByCode = getErrorEnumByCode(failInfo);
if (null != errorEnumByCode){
sdkResult.setError(errorEnumByCode);
}else if("10001".equals(failInfo)){
sdkResult.setError(ErrorEnum.CA_ILLEGAL_REQUEST_PARAMETER);
}else{
sdkResult.setError(ErrorEnum.CA_OPEN_API_INNER_EXCEPTION);
這樣錯誤碼就合理銜接了。
另外一種方案 :在設計之初ErrorEnum 僅放入ErrorBean的兩個值,在返回給前端resp的時候set錯誤碼的同時set一個非正常狀態status。
兩個方案可以中和使用,result在不同時機可以選擇set ErrorEnum 或者 ErrorBean。