点击蓝色“程序猿DD”关注我

回复“资源”获取独家整理的学习资料!

我不打算解释什么是响应式编程,也不解释为什么要使用它。我希望你已经在其他地方了解过,如果没有,你可以使用Google去搜索它。在本文中,我将告诉您如何使用专门针对Spring BootRxJava的响应式编程。让我们开始吧。

1.预备知识

在你继续阅读之前,我希望你能理解如何使用Spring BootRxJava创建简单的REST API。如果不能,你可以在Baeldung上了解更多关于Spring Boot的知识,也可以在AndroidHive上了解更多关于RxJava的知识。它们很好地解释了这两种技术。

2.响应式REST API

构建一个只包含作者和书籍的简单CRUD响应式REST API。这些是端点:

[POST] /api/authors → 添加作者

[POST] /api/books → 添加书籍

[PUT] /api/books/{bookId} → 根据书籍id更新书籍信息

[GET] /api/books?limit={limit}&page={page} → 分页获取书籍列表

[GET] /api/book/{bookId} → 根据书籍id获取书籍详细信息

[DELETE] /api/book/{bookId} → 删除书籍

3.依赖

打开pom.xml并添加如下依赖项。

<dependencies> <dependency>  <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId>    <version>2.1.5.RELEASE</version>    </dependency> <dependency>  <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId>   <version>2.1.5.RELEASE</version>    </dependency> <dependency>  <groupId>io.reactivex</groupId> <artifactId>rxjava</artifactId> <version>1.3.8</version>    </dependency> <!--IMPORTANT!!! ADD THIS DEPENDENCY TO SOLVE HttpMediaNotAcceptableException-->  <dependency>  <groupId>io.reactivex</groupId> <artifactId>rxjava-reactive-streams</artifactId>    <version>1.2.1</version>    </dependency> <dependency>  <groupId>com.h2database</groupId>   <artifactId>h2</artifactId> <version>1.4.199</version>  </dependency> <dependency>  <groupId>org.projectlombok</groupId>    <artifactId>lombok</artifactId> <optional>true</optional>   <version>1.18.8</version>   </dependency> <dependency>  <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId>   <version>2.1.5.RELEASE</version>    <scope>test</scope> </dependency> <dependency>  <groupId>org.mockito</groupId>  <artifactId>mockito-core</artifactId>   <version>2.25.0</version>   <scope>test</scope> </dependency> </dependencies>

备注:请记住,您必须添加第19-23行依赖项。如果您不添加该依赖项,那么每次您点击响应式API时都会得到HttpMediaNotAcceptableException。如您所见,我还添加了mockito作为单元测试中mock对象的依赖项。但是我将在另一篇文章中讨论单元测试。

4.服务层

对于服务层,返回值不仅仅是常规数据类型,而是我将它们封装在RxJavaSingle(单一)数据类型中。例如,下面的代码处理新书的添加。

@Override   public Single<String> addBook(AddBookRequest addBookRequest) {    return saveBookToRepository(addBookRequest);    }   private Single<String> saveBookToRepository(AddBookRequest addBookRequest) {  return Single.create(singleSubscriber -> {   Optional<Author> optionalAuthor = authorRepository.findById(addBookRequest.getAuthorId());   if (!optionalAuthor.isPresent())    singleSubscriber.onError(new EntityNotFoundException());    else {  String addedBookId = bookRepository.save(toBook(addBookRequest)).getId();  singleSubscriber.onSuccess(addedBookId);    }   }); }   private Book toBook(AddBookRequest addBookRequest) {    Book book = new Book();    BeanUtils.copyProperties(addBookRequest, book); book.setId(UUID.randomUUID().toString());   book.setAuthor(Author.builder() .id(addBookRequest.getAuthorId())   .build());  return book;    }

正如您所看到的,addBook方法的返回值是一个封装在RxJava中的字符串。

5.web层

@PostMapping(    consumes = MediaType.APPLICATION_JSON_VALUE,   produces = MediaType.APPLICATION_JSON_VALUE    )   public Single<ResponseEntity<BaseWebResponse>> addBook(@RequestBody AddBookWebRequest addBookWebRequest) { return bookService.addBook(toAddBookRequest(addBookWebRequest)) .subscribeOn(Schedulers.io())   .map(s -> ResponseEntity.created(URI.create("/api/books/" + s)).body(BaseWebResponse.successNoData()));   }   private AddBookRequest toAddBookRequest(AddBookWebRequest addBookWebRequest) {  AddBookRequest addBookRequest = new AddBookRequest();  BeanUtils.copyProperties(addBookWebRequest, addBookRequest);    return addBookRequest;  }

在web层中,它只是将请求转发给相应的服务,如上所示,用于处理新书的添加。

6.结束

整个代码(+单元测试)可以在GitHub上找到。

推荐关注:锅外的大佬

由SpringForAll社区核心成员维护,专注于收集国外优质、前沿好文,带大家了解锅外大佬们都在搞啥,有什么独到观点!

留言交流不过瘾?添加微信:zyc_enjoy

根据指引加入各种主题讨论群

  • 阿里程序员推荐的15 款常用开发者工具

  • 一文学会Maven私服的搭建

  • 真实的上海IT圈:张江男vs漕河泾男

  • IntelliJ IDEA 2019 快捷键终极大全,速度收藏!

  • Java 程序员常用的 22 个Linux命令

点一点“阅读原文”小惊喜在等你

使用Spring Boot和RxJava的构建响应式REST API相关推荐

  1. Spring Boot 中使用 Swagger2 构建强大的 RESTful API 文档

    项目现状:由于前后端分离,没有很好的前后端合作工具. 由于接口众多,并且细节复杂(需要考虑不同的HTTP请求类型.HTTP头部信息.HTTP请求内容等),高质量地创建这份文档本身就是件非常吃力的事,下 ...

  2. Spring Boot中使用Swagger2构建强大的RESTful API文档

    由于Spring Boot能够快速开发.便捷部署等特性,相信有很大一部分Spring Boot的用户会用来构建RESTful API.而我们构建RESTful API的目的通常都是由于多终端的原因,这 ...

  3. Spring Boot 实践折腾记(11):使用 Spring 5的WebFlux快速构建效响应式REST API

    关于Spring 5中的反应式编程支持Reactor类库,上一篇文章< Spring Boot 实践折腾记(10):2.0+版本中的反应式编程支持--Reactor>已经简要介绍过,Spr ...

  4. Spring Boot中使用Swagger2构建RESTful APIs

    关于 Swagger Swagger能成为最受欢迎的REST APIs文档生成工具之一,有以下几个原因: Swagger 可以生成一个具有互动性的API控制台,开发者可以用来快速学习和尝试API. S ...

  5. java Spring Boot中使用Swagger2构建API文档

    1.添加Swagger2的依赖 在pom.xml中加入Swagger2的依赖 <dependency><groupId>io.springfox</groupId> ...

  6. 分享九款构建响应式网站的最佳PHP框架

    目前,网上有大量的框架供大家选择,本文作者分享了9款各方面都兼具优势的PHP框架,主要用来构建响应式网站,开发人员可以根据自己的需求来选择下面的某一个框架. 1.Symfony 2 Symfony是一 ...

  7. vue如何获取年月日_BootstrapVue——Vue和Bootstrap的相结合,构建响应式应用更简单...

    介绍 BootStrap是世界上最受欢迎的构建响应式移动优先网站的框架,Vue是当前最流行的前端框架之一,BootstrapVue则是将两者相结合,使用BootstrapVue,可以使用Vue.js和 ...

  8. www.how2j.com_HOW-TO:快速开始使用Spring 4.0,以构建简单的REST-Like API(演练)

    www.how2j.com HOW-TO:快速开始使用Spring 4.0,以构建简单的REST-Like API(演练) 关于使用Spring MVC创建Web API的另一篇教程. 不太复杂. 只 ...

  9. Skeljs – 用于构建响应式网站的前端开发框架

    skelJS 是一个轻量级的前端框架,用于构建响应式站点和应用程序.让设计人员和开发人员可能够使用四个强大的组件:CSS 网格系统,响应式处理程序,CSS 的快捷方式和插件系统. 您可能感兴趣的相关文 ...

最新文章

  1. 是什么造成了网管员的低工资?
  2. 趣谈网络协议笔记-二(第六讲)
  3. 小甲鱼-013元组tuple:上了枷锁的列表
  4. 暴力求解法 之 枚举排列
  5. Android底层网络防火墙,详解Android 利用Iptables实现网络黑白名单(防火墙)
  6. word转换成pdf java代码_java代码实现word转换成pdf
  7. 动态规划入门之国王的金矿
  8. mysql 字符串枚举类型转换_MyBatis里字段到枚举类型的转换/映射
  9. Js中apply和Math.max()函数的问题及区别
  10. 回声消除原理(AEC)
  11. 压缩文件解压密码破解之fcrackzip
  12. 网站跳出率高怎么解决?
  13. 有权最短路径问题:狄克斯特拉(Dijkstra)算法 Java 实现
  14. 10 个快速提升技术水平的方法
  15. 百万调音师—Audition多轨编辑
  16. matlab RBF神经网络对iris鸢尾花数据集进行分类
  17. 简单五步看懂伦敦的银标
  18. Python爬虫实战之电影爬取过程
  19. c语言是流式,C语言中的文件又被称为流式文件。
  20. 【Sql Server】查询实战,实现不同班级的排行查询并且批量模拟数据进行查询测试

热门文章

  1. python2 python3 中 raw_input input 区别
  2. linux 批量处理 dos2unix
  3. script runat=server,%%区别
  4. Linux自动备份文件(linux计划任务)
  5. linux下kill命令小结
  6. Windows8系统服务终极优化
  7. 调用 fork() 两次以避免僵死进程
  8. ubuntu c/c++ IDE编程环境
  9. Linux C编程--进程间通信(IPC)2--信号处理函数
  10. Linux C编程--进程间通信(IPC)1--进程间通信机制概述