3.2. @RestController
3.2.1. 返回实体
@RequestMapping("/get/{id}")public Member getStatistics(@PathVariable long id) {Member statistics = memberRepostitory.findOne(id);if (statistics == null) {statistics = new Member();}return statistics;}
3.2.2. JSON
MediaType.APPLICATION_JSON_VALUE 执行结果反馈json数据
@RestController @RequestMapping("/api/persons") public class MainController {@RequestMapping(value = "/detail/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)public ResponseEntity<Persons> getUserDetail(@PathVariable Long id) {Persons user = personsRepository.findById(id);return new ResponseEntity<>(user, HttpStatus.OK);}}
3.2.3. 返回 JSON 对象 NULL 专为 "" 字符串
package api.config;import java.io.IOException;import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializerProvider;@Configuration public class JacksonConfig {@Bean@Primary@ConditionalOnMissingBean(ObjectMapper.class)public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {ObjectMapper objectMapper = builder.createXmlMapper(false).build();objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {@Overridepublic void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {jsonGenerator.writeString("");}});return objectMapper;} }
3.2.4. XML
restful 将同时支持 json 和 xml 数据传递
package com.example.api.restful;import java.util.List;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.PageRequest; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController;import com.example.api.domain.RecentRead; import com.example.api.repository.RecentReadRepostitory;@RestController @RequestMapping("/restful/article") public class ArticleRestController {@Autowiredprivate RecentReadRepostitory recentReadRepostitory;@RequestMapping(value = "/recent/read/add/{memberId}/{articleId}", method = RequestMethod.GET, produces = { "application/xml", "application/json" })public ResponseEntity<RecentRead> recentAdd(@PathVariable long memberId, @PathVariable long articleId) {RecentRead recentRead = new RecentRead();recentRead.setMemberId(memberId);recentRead.setArticleId(articleId);recentReadRepostitory.save(recentRead);return new ResponseEntity<RecentRead>(recentRead, HttpStatus.OK);}@RequestMapping(value="/recent/read/list/{id}", produces = { "application/xml", "application/json" })public List<RecentRead> recentList(@PathVariable long id) {int page = 0;int limit = 20;List<RecentRead> recentRead = recentReadRepostitory.findByMemberId(id, new PageRequest(page, limit));return recentRead;} }
3.2.5. 兼容传统 json 接口
开发中发现很多人不适应新的接口方式,有时候只能妥协,这些顽固不化的人需要这样的数据库格式
{ "status":true,"reason":"登录成功","code":1,"data":{"id":2,"name":null,"sex":null,"age":0,"wechat":null,"mobile":"13113668890","picture":null,"ipAddress":"0:0:0:0:0:0:0:1"} }
返回数据必须放在 data 字典中, 而我通常是采用 http status code 来返回状态,返回结果是对象。实现上面的需求我们需要加入一个data成员变量,因为我们不清楚最终要返回什么对象。所以声明为 java.lang.Object
package com.example.api.pojo;import java.io.Serializable;public class RestfulResponse implements Serializable {/*** */private static final long serialVersionUID = -4045645995352698349L;private boolean status;private String reason;private int code;private Object data;public RestfulResponse(boolean status, int code, String reason, Object data) {this.status = status;this.code = code;this.reason = reason;this.data = data;}public boolean isStatus() {return status;}public void setStatus(boolean status) {this.status = status;}public String getReason() {return reason;}public void setReason(String reason) {this.reason = reason;}public int getCode() {return code;}public void setCode(int code) {this.code = code;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}@Overridepublic String toString() {return "RestfulResponse [status=" + status + ", reason=" + reason + ", code=" + code + ", data=" + data + "]";}}
Service
public RestfulResponse bindWechat(String mobile, String wechat) {Member member = memberRepository.findByMobile(mobile);member.setWechat(wechat);memberRepository.save(member);return new RestfulResponse(true, 1, "微信绑定成功", member);}
Controller
@RequestMapping("/login/sms/{mobile}/{code}")public RestfulResponse sms(@PathVariable String mobile, @PathVariable String wechat) {return memberService.bindWechat(mobile, wechat);}
3.2.6. @PageableDefault 分页
@RequestMapping(value = "/list", method=RequestMethod.GET) public Page<Blog> getEntryByPageable1(@PageableDefault( sort = { "id" }, direction = Sort.Direction.DESC) Pageable pageable) {return blogRepository.findAll(pageable); }@RequestMapping(value = "/blog", method=RequestMethod.GET) public Page<Blog> getEntryByPageable(@PageableDefault(value = 15, sort = { "id" }, direction = Sort.Direction.DESC) Pageable pageable) {return blogRepository.findAll(pageable); }@RequestMapping(value = "/list", method=RequestMethod.GET) public Page<Blog> getEntryByPageable2(@PageableDefault Pageable pageable) {return blogRepository.findAll(pageable); }@ModelAttribute("users") public Page<User> users(@PageableDefault(size = 5) Pageable pageable) {return userManagement.findAll(pageable); }
我们只需要在方法的参数中直接定义一个pageable类型的参数,当Spring发现这个参数时,Spring会自动的根据request的参数来组装该pageable对象,Spring支持的request参数如下:page,第几页,从0开始,默认为第0页 size,每一页的大小,默认为20 sort,排序相关的信息,以property,property(,ASC|DESC)的方式组织,例如sort=firstname&sort=lastname,desc表示在按firstname正序排列基础上按lastname倒序排列 这样,我们就可以通过url的参数来进行多样化、个性化的查询,而不需要为每一种情况来写不同的方法了。通过url来定制pageable很方便,但唯一的缺点是不太美观,因此我们需要为pageable设置一个默认配置,这样很多情况下我们都能够通过一个简洁的url来获取信息了。Spring提供了@PageableDefault帮助我们个性化的设置pageable的默认配置。例如@PageableDefault(value = 15, sort = { "id" }, direction = Sort.Direction.DESC)表示默认情况下我们按照id倒序排列,每一页的大小为15。
原文出处:Netkiller 系列 手札
本文作者:陈景峯
转载请与作者联系,同时请务必标明文章原始出处和作者信息及本声明。
3.2. @RestController相关推荐
- @Controller和@RestController的区别?
@RestController注解相当于@ResponseBody + @Controller合在一起的作用 1) 如果只是使用@RestController注解Controller,则Control ...
- @RestController和@Controller注解的区别
2019独角兽企业重金招聘Python工程师标准>>> @RestController和@Controller是我们在前端控制层用在类上面的一个注解,这个我们大家都很熟悉. @Res ...
- SpringBoot 中 @RestController 和 @Controller 的区别
1 - 在springboot中,@RestController 相当于 @Controller + @ResponseBody; 2 - 即在Controller类中,若想返回jsp或html页面, ...
- @RestController和@Controller区别
官方文档: @RestController is a stereotype annotation that combines @ResponseBody and @Controller. 意思是: @ ...
- Spring中@Controller和@RestController之间的区别
1. Controller, RestController的共同点 都是用来表示Spring某个类的是否可以接收HTTP请求 2. Controller, RestController的不同点 @C ...
- @RestController/@Controller/@ResponseBody
1) 如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,或者html,配置的视图解析器 InternalResourceViewRe ...
- springmvc提供RestController方法接口返回json数据中文乱码
web应用使用@RestController @RequestMapping 注解提供http接口 项目中遇到被调用接口后返回的json数据中出现中文乱码的问题 @RequestMapping(met ...
- 【springboot】【若依(ruoyi)】@RestController 接口支持 JSONP
前言 若依(ruoyi): v4.3 springboot 2.1.1.RELEASE spring 5.1.3.RELEASE 360极速浏览器 12.0.1476.0 (正式版本) (32 位) ...
- spring4.0之三:@RestController
spring4.0重要的一个新的改进是@RestController注解,它继承自@Controller注解.4.0之前的版本,Spring MVC的组件都使用@Controller来标识当前类是一个 ...
- Springboot中艾特Controller和艾特RestController之间的区别
先说一下,头条题目不让打@,真的抱歉. springboot中@RestController和@Controller的区别,其实是一个很容易忽略的点.说一下我的踩坑经历,因为之前项目是前后端分离的,前 ...
最新文章
- c++ 从文本中逐行读取,并按空格对读取的一行进行分割
- 算法题:实现一个IP白名单过滤器
- python多线程实现同步的方式_深入解析Python中的线程同步方法
- 8086汇编-实验3-编程、编译、链接、跟踪
- matlab 多核并行编程
- JavaFX自定义控件– Nest Thermostat第1部分
- 计算机操作员(中级工)理论知识试卷,计算机操作员中级工理论试卷.doc
- Oracle 多表查询
- python.pandas数据清洗(数据填充与条件删除)
- Docker安装ik分词器
- 导航动态避让算法RVO的优化ORCA(Optimal Reciprocal Collision Avoidance)
- 一个nginx小白的vue项目部署的成功!
- matlab图像噪点消除,基于噪点检测的中值滤波图像去噪方法
- Leetcode 858. 镜面反射 Python解法
- 【志强课堂】文案到底有何作用和威力?
- dynamic 365 前端操作
- 灵活组合复合图元模板,电路图状态图业务定义可配置,浮云E绘图软件源码开发
- QQ通讯录(不完整版)
- praat对音频文件进行标注
- centso7.2上mysql安装
热门文章
- Magento怎么升级?
- 搜索算法(一)--DFS/BFS求解拯救同伴问题(JAVA)
- 记最近分析的一个锁屏幕病毒
- Linux项目第一次访问非常慢,后来很快的异常
- android来电事件,android – 来电时没有响铃事件
- redhat linux 安装ftp服务,RedHat Linux 9.0为例介绍一下如何安装和配置vsftpd服务器
- java web redis_java web redis使用(二)
- linux shell sql赋值,Linux下shell执行SQL
- python 漂亮界面demo_在这个什么都看脸的时代,如何用 GUI 提高 python 程序的颜值?...
- 电脑显示器不亮主机正常_电脑主机已开机 显示屏却不亮(看完秒懂)