一、使用场景
spring boot 使用
自定义相应数据结构,主要提供给用户,ios,android,微信商城用的,增加了返回结果的可读性。
二、代码
1.工具类
import java.util.List;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
*
* @Title: S2VJSONResult.java
* @Package com.lee.utils
* @Description: 自定义响应数据结构
* 这个类是提供给门户,ios,安卓,微信商城用的
* 门户接受此类数据后需要使用本类的方法转换成对于的数据类型格式(类,或者list)
* 其他自行处理
* 200:表示成功
* 500:表示错误,错误信息在msg字段中
* 501:bean验证错误,不管多少个错误都以map形式返回
* 502:拦截器拦截到用户token出错
* 555:异常抛出信息
* Copyright: Copyright (c) 2016
* Company:Nathan.Lee.Salvatore
*
* @author laizhen
* @date 2018年4月22日 下午8:33:36
* @version V1.0
*/
public class S2VJSONResult {
// 定义jackson对象
private static final ObjectMapper MAPPER = new ObjectMapper();
// 响应业务状态
private Integer status;
// 响应消息
private String msg;
// 响应中的数据
private Object data;
private String ok; // 不使用
public static S2VJSONResult build(Integer status, String msg, Object data) {
return new S2VJSONResult(status, msg, data);
}
public static S2VJSONResult ok(Object data) {
return new S2VJSONResult(data);
}
public static S2VJSONResult ok() {
return new S2VJSONResult(null);
}
public static S2VJSONResult errorMsg(String msg) {
return new S2VJSONResult(500, msg, null);
}
public static S2VJSONResult errorMap(Object data) {
return new S2VJSONResult(501, "error", data);
}
public static S2VJSONResult errorTokenMsg(String msg) {
return new S2VJSONResult(502, msg, null);
}
public static S2VJSONResult errorException(String msg) {
return new S2VJSONResult(555, msg, null);
}
public S2VJSONResult() {
}
// public static LeeJSONResult build(Integer status, String msg) {
// return new LeeJSONResult(status, msg, null);
// }
public S2VJSONResult(Integer status, String msg, Object data) {
this.status = status;
this.msg = msg;
this.data = data;
}
public S2VJSONResult(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;
}
/**
*
* @Description: 将json结果集转化为LeeJSONResult对象
* 需要转换的对象是一个类
* @param jsonData
* @param clazz
* @return
*
* @author leechenxiang
* @date 2016年4月22日 下午8:34:58
*/
public static S2VJSONResult formatToPojo(String jsonData, Class> clazz) {
try {
if (clazz == null) {
return MAPPER.readValue(jsonData, S2VJSONResult.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;
}
}
/**
*
* @Description: 没有object对象的转化
* @param json
* @return
*
* @author leechenxiang
* @date 2016年4月22日 下午8:35:21
*/
public static S2VJSONResult format(String json) {
try {
return MAPPER.readValue(json, S2VJSONResult.class);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
*
* @Description: Object是集合转化
* 需要转换的对象是一个list
* @param jsonData
* @param clazz
* @return
*
* @author leechenxiang
* @date 2016年4月22日 下午8:35:31
*/
public static S2VJSONResult 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;
}
}
public String getOk() {
return ok;
}
public void setOk(String ok) {
this.ok = ok;
}
}
2.调用的实体类
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
@Configuration //说明会引用资源文件
@ConfigurationProperties(prefix="com.imooc.opensource")
@PropertySource(value="classpath:/resource.properties") //资源文件地址
public class Resource {
private String name;
private String website;
private String language;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getWebsite() {
return website;
}
public void setWebsite(String website) {
this.website = website;
}
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
}
3.在spring boot 中使用
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.laizhen.pojo.S2VJSONResult;
import com.laizhen.pojo.Resource;
@RestController
@EnableConfigurationProperties(Resource.class) //把实体类指向资源文件
public class HelloContoller {
@Autowired //自动授权
private Resource resource;
@RequestMapping("/getResource")
public S2VJSONResult getResource(){
Resource bean = new Resource();
BeanUtils.copyProperties(resource, bean);
return S2VJSONResult.ok(bean);
}
}
4.结果
项目跑起来之后:
打开浏览器,根据自己的实际情况输入,
http://ip:port/getResource
结果:
{"status":200,"msg":"OK","data":{"name":"lz","website":"www.liangyu.com","language":"java"},"ok":null}