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相关推荐

  1. @Controller和@RestController的区别?

    @RestController注解相当于@ResponseBody + @Controller合在一起的作用 1) 如果只是使用@RestController注解Controller,则Control ...

  2. @RestController和@Controller注解的区别

    2019独角兽企业重金招聘Python工程师标准>>> @RestController和@Controller是我们在前端控制层用在类上面的一个注解,这个我们大家都很熟悉. @Res ...

  3. SpringBoot 中 @RestController 和 @Controller 的区别

    1 - 在springboot中,@RestController 相当于 @Controller + @ResponseBody; 2 - 即在Controller类中,若想返回jsp或html页面, ...

  4. @RestController和@Controller区别

    官方文档: @RestController is a stereotype annotation that combines @ResponseBody and @Controller. 意思是: @ ...

  5. Spring中@Controller和@RestController之间的区别

    1. Controller, RestController的共同点 都是用来表示Spring某个类的是否可以接收HTTP请求 2.  Controller, RestController的不同点 @C ...

  6. @RestController/@Controller/@ResponseBody

    1) 如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,或者html,配置的视图解析器 InternalResourceViewRe ...

  7. springmvc提供RestController方法接口返回json数据中文乱码

    web应用使用@RestController @RequestMapping 注解提供http接口 项目中遇到被调用接口后返回的json数据中出现中文乱码的问题 @RequestMapping(met ...

  8. 【springboot】【若依(ruoyi)】@RestController 接口支持 JSONP

    前言 若依(ruoyi): v4.3 springboot 2.1.1.RELEASE spring 5.1.3.RELEASE 360极速浏览器 12.0.1476.0 (正式版本) (32 位) ...

  9. spring4.0之三:@RestController

    spring4.0重要的一个新的改进是@RestController注解,它继承自@Controller注解.4.0之前的版本,Spring MVC的组件都使用@Controller来标识当前类是一个 ...

  10. Springboot中艾特Controller和艾特RestController之间的区别

    先说一下,头条题目不让打@,真的抱歉. springboot中@RestController和@Controller的区别,其实是一个很容易忽略的点.说一下我的踩坑经历,因为之前项目是前后端分离的,前 ...

最新文章

  1. c++ 从文本中逐行读取,并按空格对读取的一行进行分割
  2. 算法题:实现一个IP白名单过滤器
  3. python多线程实现同步的方式_深入解析Python中的线程同步方法
  4. 8086汇编-实验3-编程、编译、链接、跟踪
  5. matlab 多核并行编程
  6. JavaFX自定义控件– Nest Thermostat第1部分
  7. 计算机操作员(中级工)理论知识试卷,计算机操作员中级工理论试卷.doc
  8. Oracle 多表查询
  9. python.pandas数据清洗(数据填充与条件删除)
  10. Docker安装ik分词器
  11. 导航动态避让算法RVO的优化ORCA(Optimal Reciprocal Collision Avoidance)
  12. 一个nginx小白的vue项目部署的成功!
  13. matlab图像噪点消除,基于噪点检测的中值滤波图像去噪方法
  14. Leetcode 858. 镜面反射 Python解法
  15. 【志强课堂】文案到底有何作用和威力?
  16. dynamic 365 前端操作
  17. 灵活组合复合图元模板,电路图状态图业务定义可配置,浮云E绘图软件源码开发
  18. QQ通讯录(不完整版)
  19. praat对音频文件进行标注
  20. centso7.2上mysql安装

热门文章

  1. Magento怎么升级?
  2. 搜索算法(一)--DFS/BFS求解拯救同伴问题(JAVA)
  3. 记最近分析的一个锁屏幕病毒
  4. Linux项目第一次访问非常慢,后来很快的异常
  5. android来电事件,android – 来电时没有响铃事件
  6. redhat linux 安装ftp服务,RedHat Linux 9.0为例介绍一下如何安装和配置vsftpd服务器
  7. java web redis_java web redis使用(二)
  8. linux shell sql赋值,Linux下shell执行SQL
  9. python 漂亮界面demo_在这个什么都看脸的时代,如何用 GUI 提高 python 程序的颜值?...
  10. 电脑显示器不亮主机正常_电脑主机已开机 显示屏却不亮(看完秒懂)