1. 程式人生 > >JSON統一格式返回值,統一異常處理

JSON統一格式返回值,統一異常處理

一,如果編寫介面給他人呼叫,只有一段返回資料,沒有其他資訊說明這是非常不好的。

那問題來了,怎麼不好呢?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)));

效果: