个人博客: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)));
效果: