JSON统一格式返回值,统一异常处理

个人博客:http:www.stopping.top 欢迎来访。

一,如果编写接口给他人调用,只有一段返回数据,没有其他信息说明这是非常不好的。

那问题来了,怎么不好呢?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)));

 

效果:

 

 

 


 

展开阅读全文
©️2020 CSDN 皮肤主题: 创作都市 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值