文章目录
BigDevil_—JsonResult
import java.util.List;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* 自定义响应结构
*/
public class JsonResult {
// 定义jackson对象
private static final ObjectMapper MAPPER = new ObjectMapper();
// 响应业务状态
private Integer status;
// 响应消息
private String msg;
// 响应中的数据
private Object data;
public static JsonResult build(Integer status, String msg, Object data) {
return new JsonResult(status, msg, data);
}
public static JsonResult ok(Object data) {
return new JsonResult(data);
}
public static JsonResult ok() {
return new JsonResult(null);
}
public JsonResult() {
}
public static JsonResult build(Integer status, String msg) {
return new JsonResult(status, msg, null);
}
public JsonResult(Integer status, String msg, Object data) {
this.status = status;
this.msg = msg;
this.data = data;
}
public JsonResult(Object data) {
this.status = 200;
this.msg = "OK";
this.data = data;
}
// public Boolean isOK() {
// return this.status == 200;
// }
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
/**
* 将json结果集转化为JsonResult
* @param jsonData json数据
* @param clazz JsonResult中的object类型
* @return
*/
public static JsonResult formatToPojo(String jsonData, Class<?> clazz) {
try {
if (clazz == null) {
return MAPPER.readValue(jsonData, JsonResult.class);
}
JsonNode jsonNode = MAPPER.readTree(jsonData);
JsonNode data = jsonNode.get("data");
Object obj = null;
if (clazz != null) {
if (data.isObject()) {
obj = MAPPER.readValue(data.traverse(), clazz);
} else if (data.isTextual()) {
obj = MAPPER.readValue(data.asText(), clazz);
}
}
return build(jsonNode.get("status").intValue(), jsonNode.get("msg").asText(), obj);
} catch (Exception e) {
return null;
}
}
/**
* 没有object对象的转化
*
* @param json
* @return
*/
public static JsonResult format(String json) {
try {
return MAPPER.readValue(json, JsonResult.class);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* Object是集合 转化
*
* @param jsonData json数据
* @param clazz 集合中的类型
* @return
*/
public static JsonResult formatToList(String jsonData, Class<?> clazz) {
try {
JsonNode jsonNode = MAPPER.readTree(jsonData);
JsonNode data = jsonNode.get("data");
Object obj = null;
if (data.isArray() && data.size() > 0) {
obj = MAPPER.readValue(data.traverse(),
MAPPER.getTypeFactory().constructCollectionType(List.class, clazz));
}
return build(jsonNode.get("status").intValue(), jsonNode.get("msg").asText(), obj);
} catch (Exception e) {
return null;
}
}
}
毕设使用—JSONResultUtil
public class JSONResultUtil {
private boolean success;
private Object data;
private String msg;
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public JSONResultUtil() {
super();
}
public JSONResultUtil(boolean success) {
super();
this.success = success;
}
public JSONResultUtil(boolean success, String msg) {
super();
this.success = success;
this.msg = msg;
}
/**
* 返回正确结果不带数据
* @return
*/
public static JSONResultUtil ok() {
return new JSONResultUtil(true);
}
/**
* 返回错误结果带错误信息
* @param msg
* @return
*/
public static JSONResultUtil error(String msg) {
return new JSONResultUtil(false, msg);
}
}
SSM项目使用—ResultEntity
package com.study.util;
import java.util.HashMap;
import java.util.Map;
/**
* @author:发则韩
* @description:统一返回结果实体类
* 使用案例: ResultEntity.success().put("page",pageInfo)
* .put("requestURI",request.getRequestURI());
* 返回状态码200,消息为操作成功,分页的信息,请求URI
*/
public class ResultEntity {
private Map<String,Object> map = new HashMap<>();
/**
* @author 发则韩
* @description 成功后返回状态码200,消息为操作成功,
* 返回一个ResultEntity为了继续调用put方法
*/
public static ResultEntity success(){
ResultEntity resultEntity = new ResultEntity();
resultEntity.map.put("statusCode", 200);
resultEntity.map.put("message", "操作成功");
return resultEntity;
}
/**
* @author 发则韩
* @description 成功后返回状态码500,消息为操作失败,
* 返回一个ResultEntity为了继续调用put方法
*/
public static ResultEntity error(){
ResultEntity resultEntity = new ResultEntity();
resultEntity.map.put("statusCode", 500);
resultEntity.map.put("message", "操作失败");
return resultEntity;
}
/**
* @author 发则韩
* @description 往当前ResultEntity的map继续添加key-value,
* 如分页数据 put("page",pageInfo)
*/
public ResultEntity put(String key,Object value){
this.map.put(key, value);
return this;
}
public Map<String, Object> getMap() {
return map;
}
public void setMap(Map<String, Object> map) {
this.map = map;
}
}
这个方法的返回结果样式:
{
"map":{
"statusCode":500,
"message":"操作失败"
}
}
很明显会多一层map,因此需要优化。
优化后的实体类
import com.fasterxml.jackson.annotation.JsonInclude;
import java.util.HashMap;
import java.util.Map;
/**
* 统一返回结果实体类
*/
@JsonInclude(JsonInclude.Include.NON_NULL) //如果data为null,则不显示
public class ResultEntity {
private Integer code;
private String message;
private Map<String,Object> data;
/**
* 返回状态码200,消息自定义
* 返回一个ResultEntity为了继续调用put方法
*/
public static ResultEntity success(String message){
ResultEntity resultEntity = new ResultEntity();
resultEntity.code = 200;
resultEntity.message = message;
return resultEntity;
}
/**
* 返回状态码500,消息自定义
* 返回一个ResultEntity为了继续调用put方法
*/
public static ResultEntity error(String message){
ResultEntity resultEntity = new ResultEntity();
resultEntity.code = 500;
resultEntity.message = message;
return resultEntity;
}
/**
* 返回状态码自定义,消息自定义
* 返回一个ResultEntity为了继续调用put方法
*/
public static ResultEntity error(Integer code, String message){
ResultEntity resultEntity = new ResultEntity();
resultEntity.code = code;
resultEntity.message = message;
return resultEntity;
}
/**
* 往当前ResultEntity的map继续添加key-value
*/
public ResultEntity put(String key,Object value){
if(this.data == null){
this.data = new HashMap<>();
}
this.data.put(key, value);
return this;
}
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 void setData(Map<String,Object> data) {
this.data = data;
}
public java.util.Map<String, Object> getData() {
return data;
}
}
Spring Boot项目使用—AppResponse与枚举类
创建一个泛型类AppResponse<T>
,定义三个私有成员变量code(Integer型)、msg(String型)、data(T型)
,分别的作用是响应码,响应消息以及响应数据
。定义两个静态方法ok(T data)和fail(T data)
,用于快速返回响应成功或失败,成功和失败的响应码以及响应信息
从枚举类ResponseCodeEnum
中获取,响应的数据通过参数传递进来后设置到变量data
中。
AppResponse.java
import com.study.common.enums.ResponseCodeEnum;
/**
* 应用统一返回结果数据封装类
* @author Administrator
* @param <T> 返回结果数据类型
*/
public class AppResponse<T> {
private Integer code;
private String msg;
private T 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;
}
/**
* 快速响应成功
* @param data
* @return
*/
public static<T> AppResponse<T> ok(T data){
AppResponse<T> resp = new AppResponse<T>();
// 对应枚举类中的 0
resp.setCode(ResponseCodeEnum.SUCCESS.getCode());
// 对应枚举类中的 "操作成功"
resp.setMsg(ResponseCodeEnum.SUCCESS.getMsg());
resp.setData(data);
return resp;
}
/**
* 快速响应失败
*/
public static<T> AppResponse<T> fail(T data){
AppResponse<T> resp = new AppResponse<T>();
// 对应枚举类中的 1
resp.setCode(ResponseCodeEnum.FAIL.getCode());
// 对应枚举类中的 "服务器异常"
resp.setMsg(ResponseCodeEnum.FAIL.getMsg());
resp.setData(data);
return resp;
}
}
枚举类ResponseCodeEnum.java
public enum ResponseCodeEnum {
SUCCESS(0,"操作成功"),
FAIL(1,"服务器异常"),
PARAM_INVAILD(400,"提交参数非法"),
NOT_AUTHED(403,"无权限,访问拒绝"),
NOT_FOUND(404,"资源未找到");
private Integer code;
private String msg;
private ResponseCodeEnum(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
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;
}
}
多提一嘴,枚举类用于定义多个固定值来对应某个业务的多个场景,比如订单状态OrderStatusEnum、项目状态ProjectStatusEnum等。
public enum OrderStatusEnumes {
UNPAY((byte)0,"未支付"),
CANCEL((byte)1,"已取消"),
PAYED((byte)2,"支付成功"),
WAITING((byte)3,"等待发货"),
SEND((byte)4,"已发货"),
SENDED((byte)5,"已送达"),
SUCCESS((byte)6,"交易完成"),
FAIL((byte)7,"交易未完成");
private byte code;
private String status;
public byte getCode() {
return code;
}
public void setCode(byte code) {
this.code = code;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
private OrderStatusEnumes(byte code, String status) {
this.code = code;
this.status = status;
}
}
--------------------------分割线------------------------
/**
* 项目状态
*/
public enum ProjectStatusEnume {
DRAFT((byte)0,"草稿"),
SUBMIT_AUTH((byte)1,"提交审核申请"),
AUTHING((byte)2,"后台正在审核"),
AUTHED((byte)3,"后台审核通过"),
AUTHFAIL((byte)4,"审核失败"),
STARTING((byte)5,"开始众筹"),//新增众筹项目一些状态
SUCCESS((byte)6,"众筹成功"),
FINISHED((byte)7,"众筹完成"),
FAIL((byte)8,"众筹失败");
private byte code;
private String status;
public byte getCode() {
return code;
}
public void setCode(byte code) {
this.code = code;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
private ProjectStatusEnume(byte code, String status) {
this.code = code;
this.status = status;
}
}