JSON統一格式返回值,統一異常處理
阿新 • • 發佈:2019-01-10
一,如果編寫介面給他人呼叫,只有一段返回資料,沒有其他資訊說明這是非常不好的。
那問題來了,怎麼不好呢?1,如果知識返回一段呼叫後的資料那還好,要是呼叫失敗呢?如果沒有返回碼,沒有資訊提示,就讓呼叫者去猜測嗎,而不能做其他的處理。
所以為了更加規範的處理返回格式的問題,我把json封裝了起來。
二,具體實現
用一個實體類規範json返回的格式
/** * @author Stopping * @see 統一json返回格式 * */ public class Result { /*返回碼*/ private Integer code; /*返回資訊提示*/ private String message; /*返回的資料*/ private Object data; public Result(){} public Result(Integer code,String message,Object data) { this.code = code; this.message = message; this.data = data; } @Override public String toString() { return "Result [code=" + code + ", message=" + message + ", data=" + data + "]"; } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } }
編寫一個列舉類,統一管理異常返回資訊
/** * @author Stopping * @data 時間:2017/9/27 * */ public enum ResultEnum { /**訪問成功返回*/ SUCCESS(0,"success"), /**資料不存在返回*/ NOT_FOUND(-1,"notFound [資料不存在 或者 資料為空]"), /**異常返回*/ ERROR(-1,"error [未知異常]"), /**引數有異常返回*/ PARAMETER_ERROR(-1,"parameter error [引數異常:引數為空或者引數型別不符]") ; private Integer code; private String msg; private ResultEnum(Integer code,String msg) { this.code = code; this.msg = msg; } public Integer getCode() { return code; } public String getMsg() { return msg; } }
編寫rusult工具類
編寫一個判斷異常的方法工具類/** * @author Stopping * @Data 2017/9/25 * @see json返回值統一格式化工具類 * */ public class ResultUtil { /** * 資料互動成功返回 * @param object json返回的資料 * */ public static Result success(Object object){ if(object==null){ object = ""; } return new Result(ResultEnum.SUCCESS.getCode(),ResultEnum.SUCCESS.getMsg(),object); } /** * 資料互動 * */ public static Result notFound(){ return new Result(ResultEnum.NOT_FOUND.getCode(),ResultEnum.NOT_FOUND.getMsg(),""); } /** * 引數異常 * */ public static Result parameterError(){ return new Result(ResultEnum.PARAMETER_ERROR.getCode(),ResultEnum.PARAMETER_ERROR.getMsg(),""); } /** * 系統異常 * */ public static Result systemError(){ return new Result(ResultEnum.ERROR.getCode(),ResultEnum.ERROR.getMsg(),""); } }
import java.util.List;
import com.jeecms.cms.entity.back.ResultEnum;
import com.jeecms.common.exception.NotFoundException;
import com.jeecms.common.exception.ParameterException;
/**
* @author Stopping
*
* 返回結果集對引數,結果判斷的方法
* */
public class ResultMethodUtil {
/**
* 判斷Integer型別的引數是否為空,為空則丟擲引數異常
* @param intergers
* */
public static void judgeIntegerNull(Integer...integers)throws Exception{
if ( integers==null || integers.length == 0) {
throw new ParameterException(ResultEnum.PARAMETER_ERROR);
}
for(Integer i : integers){
if(i==null){
throw new ParameterException(ResultEnum.PARAMETER_ERROR);
}
}
}
/**
* 判斷String型別的引數是否為空,為空則丟擲引數異常
* @param value
* */
public static void judgeStringNull(String...value)throws Exception{
for(String i : value){
if(i=="" || i==null ||"".equals(i)){
throw new ParameterException(ResultEnum.PARAMETER_ERROR);
}
}
}
/**
* 判斷返回值是否為空
* */
public static void judgeReturnNull(Object o){
if(o instanceof List){
if(((List) o).size()==0 || o==null){
throw new NotFoundException(ResultEnum.NOT_FOUND);
}
}else{
if(o==null || o.equals("") ){
throw new NotFoundException(ResultEnum.NOT_FOUND);
}
}
}
}
編寫自定義異常類,用於統一異常處理(統一異常處理可參考 SpringMVC統一異常處理:點選開啟連結)
import com.jeecms.cms.entity.back.ResultEnum;
public class ParameterException extends RuntimeException{
private Integer code;
public ParameterException(ResultEnum r) {
super(r.getMsg());
this.code = r.getCode();
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
}
捕獲異常處理import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import com.alibaba.fastjson.JSON;
import com.jeecms.common.util.ResultUtil;
import com.jeecms.common.web.ResponseUtils;
public class HandleException implements HandlerExceptionResolver{
private final static Logger logger = LoggerFactory.getLogger(HandleException.class);
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handle,
Exception ex) {
/** 引數異常 */
if(ex instanceof ParameterException){
ResponseUtils.renderJson(response,JSON.toJSONString(ResultUtil.parameterError()));
return null;
}
/** 空值異常 */
else if(ex instanceof NotFoundException){
ResponseUtils.renderJson(response,JSON.toJSONString(ResultUtil.notFound()));
return null;
}
/** 未知異常 */
else{
logger.error("系統異常",ex);
ResponseUtils.renderJson(response,JSON.toJSONString(ResultUtil.systemError()));
return null;
}
}
}
最終通過阿里的json工具包轉換為json格式,傳送給呼叫者。
ResponseUtils.renderJson(response, JSON.toJSONString(ResultUtil.success(columns)));
效果: