使用Spring Boot和RxJava的构建响应式REST API

「爱情、让人受尽委屈。」 2024-04-18 12:13 177阅读 0赞

我不打算解释什么是响应式编程,也不解释为什么要使用它。我希望你已经在其他地方了解过,如果没有,你可以使用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并添加如下依赖项。

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. <version>2.1.5.RELEASE</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-data-jpa</artifactId>
  10. <version>2.1.5.RELEASE</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>io.reactivex</groupId>
  14. <artifactId>rxjava</artifactId>
  15. <version>1.3.8</version>
  16. </dependency>
  17. <!--IMPORTANT!!! ADD THIS DEPENDENCY TO SOLVE HttpMediaNotAcceptableException-->
  18. <dependency>
  19. <groupId>io.reactivex</groupId>
  20. <artifactId>rxjava-reactive-streams</artifactId>
  21. <version>1.2.1</version>
  22. </dependency>
  23. <dependency>
  24. <groupId>com.h2database</groupId>
  25. <artifactId>h2</artifactId>
  26. <version>1.4.199</version>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.projectlombok</groupId>
  30. <artifactId>lombok</artifactId>
  31. <optional>true</optional>
  32. <version>1.18.8</version>
  33. </dependency>
  34. <dependency>
  35. <groupId>org.springframework.boot</groupId>
  36. <artifactId>spring-boot-starter-test</artifactId>
  37. <version>2.1.5.RELEASE</version>
  38. <scope>test</scope>
  39. </dependency>
  40. <dependency>
  41. <groupId>org.mockito</groupId>
  42. <artifactId>mockito-core</artifactId>
  43. <version>2.25.0</version>
  44. <scope>test</scope>
  45. </dependency>
  46. </dependencies>

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

4.服务层

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

  1. @Override
  2. public Single<String> addBook(AddBookRequest addBookRequest) {
  3. return saveBookToRepository(addBookRequest);
  4. }
  5. private Single<String> saveBookToRepository(AddBookRequest addBookRequest) {
  6. return Single.create(singleSubscriber -> {
  7. Optional<Author> optionalAuthor = authorRepository.findById(addBookRequest.getAuthorId());
  8. if (!optionalAuthor.isPresent())
  9. singleSubscriber.onError(new EntityNotFoundException());
  10. else {
  11. String addedBookId = bookRepository.save(toBook(addBookRequest)).getId();
  12. singleSubscriber.onSuccess(addedBookId);
  13. }
  14. });
  15. }
  16. private Book toBook(AddBookRequest addBookRequest) {
  17. Book book = new Book();
  18. BeanUtils.copyProperties(addBookRequest, book);
  19. book.setId(UUID.randomUUID().toString());
  20. book.setAuthor(Author.builder()
  21. .id(addBookRequest.getAuthorId())
  22. .build());
  23. return book;
  24. }

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

5.web层

  1. @PostMapping(
  2. consumes = MediaType.APPLICATION_JSON_VALUE,
  3. produces = MediaType.APPLICATION_JSON_VALUE
  4. )
  5. public Single<ResponseEntity<BaseWebResponse>> addBook(@RequestBody AddBookWebRequest addBookWebRequest) {
  6. return bookService.addBook(toAddBookRequest(addBookWebRequest))
  7. .subscribeOn(Schedulers.io())
  8. .map(s -> ResponseEntity.created(URI.create("/api/books/" + s)).body(BaseWebResponse.successNoData()));
  9. }
  10. private AddBookRequest toAddBookRequest(AddBookWebRequest addBookWebRequest) {
  11. AddBookRequest addBookRequest = new AddBookRequest();
  12. BeanUtils.copyProperties(addBookWebRequest, addBookRequest);
  13. return addBookRequest;
  14. }

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

6.结束

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

原文链接:https://dzone.com/articles/reactive-rest-api-using-spring-boot-and-rxjava-1

作者: Axellageraldinc A

译者:李东

发表评论

表情:
评论列表 (有 0 条评论,177人围观)

还没有评论,来说两句吧...

相关阅读