SpringBoot入门系列(二)如何返回统一的Json数据格式
前面介绍了Spring Boot的优点,然后介绍了如何快速创建Spring Boot 项目。不清楚的朋友可以看看之前的文章:
https://www.cnblogs.com/zhangweizhong/category/1657780.html。
今天来说一说Spring的@Controller和@RestController控制器, 他们是如何响应客户端请求,如何返回json数据。
一、@Controller和@RestController 两种控制器
Spring中有Controller,RestController的两种控制器,都是用来表示Spring某个类的是否可以接收HTTP请求。
但是不同的是:
1、Controller:标识一个Spring类是Spring MVC controller处理器。
2、RestController: 主要用于Restfull接口,返回客户端数据请求。
所以RestController是@Controller和@ResponseBody的结合体,两个标注合并起来的作用。
二、@Controller的用法
1、创建pojo 包,并创建User 对象
package com.weiz.pojo;import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;import java.util.Date;public class User {private String name;@JsonIgnoreprivate String password;private Integer age;@JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss",locale = "zh",timezone = "GMT+8")private Date birthday;@JsonInclude(JsonInclude.Include.NON_NULL)private String desc;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getDesc() {return desc;}public void setDesc(String desc) {this.desc = desc;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}
}
2、创建UserController 控制器
package com.weiz.controller;import com.weiz.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import java.util.Date;@Controller
@RequestMapping("/user")
public class UserController {@RequestMapping("/getUser")@ResponseBodypublic User getUser(){User u = new User();u.setName("weiz");u.setAge(18);u.setBirthday(new Date());u.setPassword("weiz");return u;}
}
3、运行查看数据返回,在浏览器中输入:
http://localhost:8080/user/getUser,返回数据可以看到控制器自动将user对象转换为json数据格式。
三、@RestController的用法
其实 RestController是Controller和ResponseBody的结合体,两个标注合并起来的作用。
所以,将上面的UserController 修改如下即可:
package com.weiz.controller;import com.weiz.pojo.JSONResult;
import com.weiz.pojo.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.Date;//@Controller
@RestController // RestController = Controller + ResponseBody
@RequestMapping("/user")
public class UserController {@RequestMapping("/getUser")//@ResponseBodypublic JSONResult getUser(){User u = new User();u.setName("weiz222");u.setAge(20);u.setBirthday(new Date());u.setPassword("weiz222");return u;}
}
四、Json封装
其实 RestController 给客户端返回数据时,一般会用jackson序列化返回。而不是直接返回整个pojo类对象。下面就简单介绍下如何封装返回json数据:
1、pojo类相关增加序列化格式配置,如上面的User对象的定义
2、增加Json通用的封装类JsonUtils ,下面这个就是比较常用的json数据封装类。
package com.weiz.utils;import java.util.List;import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;/*** * @Title: JSONResult.java* @Package com.weiz.utils* @Description: 自定义响应数据结构* 这个类是提供给门户,ios,安卓,微信商城用的* 门户接受此类数据后需要使用本类的方法转换成对于的数据类型格式(类,或者list)* 其他自行处理* 200:表示成功* 500:表示错误,错误信息在msg字段中* 501:bean验证错误,不管多少个错误都以map形式返回* 502:拦截器拦截到用户token出错* 555:异常抛出信息* Copyright: Copyright (c) 2016* * @author weiz* @date 2016年4月22日 下午8:33:36* @version V1.0*/
public class JSONResult {// 定义jackson对象private static final ObjectMapper MAPPER = new ObjectMapper();// 响应业务状态private Integer status;// 响应消息private String msg;// 响应中的数据private Object data;private String ok; // 不使用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 static JSONResult errorMsg(String msg) {return new JSONResult(500, msg, null);}public static JSONResult errorMap(Object data) {return new JSONResult(501, "error", data);}public static JSONResult errorTokenMsg(String msg) {return new JSONResult(502, msg, null);}public static JSONResult errorException(String msg) {return new JSONResult(555, msg, null);}public JSONResult() {}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;}/*** * @Description: 将json结果集转化为LeeJSONResult对象* 需要转换的对象是一个类* @param jsonData* @param clazz* @return* * @author weiz* @date 2016年4月22日 下午8:34:58*/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;}}/*** * @Description: 没有object对象的转化* @param json* @return* * @author weiz* @date 2016年4月22日 下午8:35:21*/public static JSONResult format(String json) {try {return MAPPER.readValue(json, JSONResult.class);} catch (Exception e) {e.printStackTrace();}return null;}/*** * @Description: Object是集合转化* 需要转换的对象是一个list* @param jsonData* @param clazz* @return* * @author weiz* @date 2016年4月22日 下午8:35:31*/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;}}public String getOk() {return ok;}public void setOk(String ok) {this.ok = ok;}}
3、如何调用
最后
以上,就把Spring Boot中的Controller及如何返回json数据介绍完了。
SpringBoot入门系列(二)如何返回统一的Json数据格式相关推荐
- Quantopian 入门系列二 - 流水线 (下)
本文含 8225 字,28 图表截屏 建议阅读 42 分钟 本贴接着上贴[Quantopian 入门系列二 - 流水线 (上)]的内容,讨论下面目录的 5- 8 节: 简介 因子 筛选器 分类器 掩码 ...
- SpringBoot入门(二)——起步依赖
本文来自网易云社区 在前一篇我们通过简单几步操作就生成了一个可以直接运行的Web程序,这是因为SpringBoot代替我们做了许多工作,概括来讲可以分为起步依赖和自动配置.这一篇先来看看起步依赖. 项 ...
- 机器学习入门系列二(关键词:多变量(非)线性回归,批处理,特征缩放,正规方程
机器学习入门系列二(关键词:多变量(非)线性回归,批处理,特征缩放,正规方程) 目录(?)[+] 一多变量的线性回归 二批处理 三特征缩放 四正规方程 五多变量非线性回归 一.多变量的线性回归 在#机 ...
- C语言速看,C语言高速入门系列(二)
C语言高速入门系列(二) -----转载请注明出处coder-pig 本节引言: 在前面一节中我们对C语言进行了初步的了解,学会了使用IDE进行代码的编写,编译执行! 在这一节中我们会对C语言的基本的 ...
- Reflex WMS入门系列二十五:将叉车纳入系统进行管理
Reflex WMS入门系列二十五:将叉车纳入系统进行管理 据笔者所知,SAP WM 模块里是不对仓库里常用的叉车等仓库管理工具进行管理的.笔者发现,Reflex WMS系统则会在很多仓库部门日常操作 ...
- Reflex WMS入门系列二十二:物料库存报表
Reflex WMS入门系列二十二:物料库存报表 在Reflex WMS系统上,我们可以通过物料号查询它的HD列表,或者IPG列表.通过在其HD/IPG信息得知其库存数据.当然还可以通过如下方式直接获 ...
- Reflex WMS入门系列二十三:几个库存相关的报表
Reflex WMS入门系列二十三:几个库存相关的报表 Reflex WMS系统作为一个主流的仓库管理软件系统,自然需要对仓库里的库存有多个角度的报表功能.比如常见的slow-moving, agin ...
- Reflex WMS入门系列二十六:合并托盘
Reflex WMS入门系列二十六:合并托盘 仓库管理业务实践中,对于仓库里的库存,将几个零托合并成一个托,也是比较常见的作业.Reflex WMS系统自然要能支持这种合并托盘(Merge HDs)的 ...
- Reflex WMS入门系列二十八:空白标签打印
Reflex WMS入门系列二十八:空白标签打印 贴在托盘上的标签,因托盘上的货物的移动,使用等缘故可能会导致标签丢失.在很多场景下又需要扫描托盘标签,所以Reflex WMS系统提供了打印空白标签的 ...
最新文章
- (zt)Web 2.0奔路进行时
- Ubuntu 设置Android adb 环境变量
- Python语言学习之pandas:DataFrame二维表的简介、常用函数、常用案例之详细攻略
- 技术人员写blog的好处
- hash和trie的对比
- 我用Python分析了“青你2”漂亮小姐姐的颜值,结果真香了!
- linux硬盘保护卡,保护卡下安装Linux
- java语言的运行平台,威力加强版
- Cap22_信息系统安全管理
- Lombok学习笔记— 消除冗余java代码
- Node.js、express、mongodb 实现分页查询、条件搜索
- Windows10性能优化设置
- android中实现图片圆形效果
- Redis数据库常用命令(超级详细)
- matlab最基础教程(四):常用的系统自带函数,符号变量与字符串篇
- 服务器文件增量备份,服务器文件增量备份
- 生成子空间的交空间与和空间
- 炉石传说iPad版抢鲜玩 最全国服登录教程
- mysql sys模式_mysql8 参考手册-sys模式存储过程diagnostics()过程
- 程序员年底如何升职加薪?这份涨薪指南来了!