本人目前在做的系统,尤其依赖另外一个系统,在调用另外一个系统时,可能会返回多种报错,如下结构的错误:
/**
* 返回异常结果对象
*
* @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。