1、前言
在业务系统中,我们一般希望所有请求放回的类型都是固定的,如:{"code":0,"message":"",data:{"id":1,"name":"zhangsan"}}, 用code表示成功还是失败,message记录失败信息,如果成功,用data返回具体的数据。为了满足这样的需求,我们必须在每个Controller都包装try catch,返回异常信息,同时所有的请求的返回对于都是该对象。有没有更好的办法解决上述问题。
2、Spring cloud 项目一般架构
从图可以发现所有的外部请求都是通过gateway进行的,因此具体业务根本不需要进行任何修改,只需在gateway中进行修改返回值。
3、实现
返回类:
/** * 响应对象 * * @param <T> */ public class ResponseVo<T> { /** * 状态码. */ private Integer code; /** * 提示信息. */ private String msg; /** * 具体的数据. */ private T data; public ResponseVo() { } public ResponseVo(Integer code, String msg) { this.code = code; this.msg = msg; } public ResponseVo(Integer code, String msg, T data) { this.code = code; this.msg = msg; this.data = data; } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public T getData() { return data; } public void setData(T data) { this.data = data; } @Override public String toString() { return "ResponseVo{" + "code=" + code + ", msg='" + msg + '\'' + ", data=" + data + '}'; } }
修复返回对象工具
public class BodyUtils { private static final Log log = LogFactory.getLog(BodyUtils.class); private final static int OK = 0; public final static String transforBody(String body) { ResponseVo responseVo = new ResponseVo(); responseVo.setCode(OK); if (StringUtils.isEmpty(body)) { responseVo.setData(body); return JSON.toJSONString(responseVo); } if (!(body.startsWith("{") && body.endsWith("}")) && !(body.startsWith("[") && body.endsWith("]"))) { responseVo.setData(body); return JSON.toJSONString(responseVo); } Object jsonObject = JSON.parse(body); if (jsonObject instanceof JSONObject) { Object code = ((JSONObject) jsonObject).get("code"); if (code != null) { if (((JSONObject) jsonObject).get("data") != null) { if (((JSONObject) jsonObject).get("data") instanceof JSONObject) { JSONObject data = (JSONObject) ((JSONObject) jsonObject).get("data"); Object total = data.get("total"); Object result = data.get("result"); if (total != null && result != null) { Map response = new HashMap<>(); for (Map.Entry<String, Object> entry : data.entrySet()) { if (entry.getKey().equals("countColumn") || entry.getKey().equals("startRow") || entry.getKey().equals("reasonable") || entry.getKey().equals("count") || entry.getKey().equals("endRow") || entry.getKey().equals("orderBy") || entry.getKey().equals("pageSize") || entry.getKey().equals("pageNum") || entry.getKey().equals("empty") || entry.getKey().equals("pages") || entry.getKey().equals("orderByOnly") || entry.getKey().equals("pageSizeZero") ) { continue; } else { response.put(entry.getKey(), entry.getValue()); } } responseVo.setData(response); return JSON.toJSONString(responseVo); } else { return body; } } else { return body; } } else { return body; } } else { responseVo.setData(jsonObject); return JSON.toJSONString(responseVo); } } else { responseVo.setData(jsonObject); return JSON.toJSONString(responseVo); } } }