开课吧-02反应式web开发框架webflux笔记_W_第1页
开课吧-02反应式web开发框架webflux笔记_W_第2页
开课吧-02反应式web开发框架webflux笔记_W_第3页
开课吧-02反应式web开发框架webflux笔记_W_第4页
开课吧-02反应式web开发框架webflux笔记_W_第5页
已阅读5页,还剩83页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 反应式 Web 开发框架WebFlux课程讲义主讲:Rey2018 反应式Web 开发框架WebFlux反应式 Web 开发框架 WebFlux第1章 WebFlux 基础1.1WebFlux 简介Spring WebFlux is a non-blocking web framework built from the ground up to takeadvantage of multi-core,next-generation processors and handle massive numbers of concurrent connections.翻译:Spring WebFlux

2、 是一个自底向上构建的非阻塞 Web 框架,用于利用多核、下一代处理 器并处理大量并发连接。 打开Spring 官网,可以看到WebFlux 在线参考文档入口地址。 讲师:Rey1 反应式Web 开发框架WebFlux翻译: 原始的web 框架包含在Spring 框架中,即 Spring Web MVC,是专为 Servlet API 与 Servlet 容器构建的。reactive stack, web framework, Spring WebFlux 最新被添加到了 Spring 5.0 版本中。它是完全地非阻塞的,支持 Reactive Streams 背压,运行在诸如 Netty、U

3、ndertow 与 Server3.1+ 容器中。 两个Web 框架都反映了它们源模块的名称:spring-webmvc 与spring-webflux,并且它们共存于Spring 框架之中。每一个模块都是可选的。应用程序可以选择一个或另一个模块,或者在某些情况下两个同时使用。例如,SpringMVC 使用反应式Web 客户端进行控制。 讲师:Rey2 反应式Web 开发框架WebFlux1.2第一个 WebFlux 程序1.2.1创建工程创建一个Spring Starter Project,Spring Boot 的版本要求最低为 2.0.0。不要添加原来的web 依赖,而是要添加 Reac

4、tive Web,即flux 依赖,并添加上 Lombok 与 DevTools 依赖。 讲师:Rey3 反应式Web 开发框架WebFlux1.2.2定义处理器1.2.3访问通过浏览器地址栏访问,并没有感觉有任何的区别。 讲师:Rey4 反应式Web 开发框架WebFlux1.2.4修改处理器(1) 添加一个耗时操作方法(2) 添加Slf4j 注解讲师:Rey5 反应式Web 开发框架WebFlux(3) 添加两个处理器方法1.2.5再访问通过浏览器地址栏访问,对于客户端来说感觉是一样的,都是在等待了大约 5 秒后才获 得了响应。但查看控制台,其输出内容是不同的。 (1) 访问普通处理器讲师

5、:Rey6 反应式Web 开发框架WebFlux仔细查看这两个时间差,发现其差值大约为 5 秒。即耗时操作阻塞了处理器 5 秒。 (2) 访问 mono 处理器仔细查看这两个时间差,发现其差值仅为 1 毫秒。即耗时操作没有阻塞了处理器的执行。这样,处理器就可以处理更多的用户请求了。虽然对于每一个客户端来说好像并没有增加用 户体验,但对于处理器来说,其吞吐量却大大提高了。 讲师:Rey7 反应式Web 开发框架WebFlux1.2.6修改处理器-Flux 用法Mono 表示,处理器返回的数据为 0-1 个;而Flux 表示,处理器返回的数据为 0-多个。 (1) 访问方式以下测试均使用如下的访问

6、URL,且不要使用火狐浏览器,而要使用谷歌或360 浏览器。 否则,有些效果看不到。 (2) 数组转 Flux讲师:Rey8 反应式Web 开发框架WebFlux(3) 集合转 Flux(4) Flux 底层不会阻塞处理器执行从对耗时操作的执行时间上可以看出,其并没有阻塞处理器方法的执行。 讲师:Rey9 反应式Web 开发框架WebFlux(5) SSESSE,Server-Sent Event,服务端推送,后面会详细学习。1.3异步 Servlet通过前面的第一个WebFlux 程序我们可以真切地体会到“非阻塞”“异步”。为了进一步加深大家对于“非阻塞”“异步”的理解,我们再来看一下异步

7、Servlet,对比一下同步 Servlet到底阻塞了什么?异步Servlet 到底对客户端与服务端的影响是什么? 讲师:Rey10 反应式Web 开发框架WebFlux1.3.1同步 Servlet(1) 定义同步 Servlet(2) 访问同步 Servlet在浏览器访问同步Servlet 时,浏览器会出现等待 5 秒时间后才可以看到“Done!”字样的情况。但关键是控制台的输出,业务逻辑耗时为 5 秒左右。 讲师:Rey11 反应式Web 开发框架WebFlux1.3.2异步 Servlet(1) 创建异步 Servlet在创建异步 Servlet 的向导中勾选“异步支持”。讲师:Rey

8、12 反应式Web 开发框架WebFlux(2) 定义异步 Servlet(3) 访问异步 Servlet在浏览器访问异步Servlet 时,浏览器同样会出现等待 5 秒时间后才可以看到“Done!” 字样的情况。但关键是控制台的输出,业务逻辑耗时为 5 毫秒左右。 讲师:Rey13 反应式Web 开发框架WebFlux1.3.3分析(1) 同步 Servlet 阻塞了什么当请求到达 Tomcat 后,Tomcat 会为其找到与该请求相匹配的 Servlet,并分配一个该Servlet 的线程处理该请求。当 Servlet 中需要处理耗时操作时,当前 Servlet 线程会被阻塞。所以当前Se

9、rvlet 中的业务逻辑阻塞了当前 Servlet 线程的执行。 (2) 异步 Servlet 是怎样工作的?异步Servlet 没有阻塞 Servlet 线程,而是很快结束了 Servlet 线程的调用,将其又放入到了 Servlet 线程池,供其它请求使用。这样就增加了 Tomcat 服务器的吞吐量了。 不过需要注意一点,虽然没有阻塞 Servlet 线程的运行,但服务端向客户端的响应是需要业务逻辑线程执行完毕后才会向客户端响应的。即对于客户端的用户体验来说,并没有感觉到服务器运算速度的加快,但服务器的吞吐量增加了。 1.4SSE反应式流编程中经常与SSE 相结合使用,所以我们这里学习一下

10、 SSE 相关知识。 老的http 协议是请求-响应式的,即客户端提交一个请求,服务端会只会给出一个响应。但对于某些实时性要求比较高的需求(例如微博消息推送),若使用这种原始的请求-响应方方特性,主流浏览器对其支持是较好的(除了火狐)。 1.4.1SSE 简介(1) SSE 能做什么? 理论上, SSE 和 WebSocket 做的是同一件事情。当你需要用新数据局部更新网络应用讲师:Rey14 反应式Web 开发框架WebFlux时,SSE 可以做到不需要用户执行任何操作便可以完成。 例如要做一个统计系统的管理,我们想知道统计数据的实时情况。类似这种更新频繁、低延迟的场景,SSE 可以完全满足

11、。再比如,邮箱服务的新邮件提醒,微博的新消息推送、在线聊天记录的显示等,SSE 都是不错的选择。 (2) SSE 对比 WebSocketSSE 是单向通道,只能服务器向客户端发送消息,如果客户端需要向服务器发送消息, 则需要一个新的 HTTP 请求。这对比 WebSocket 的双工通道来说,会有更大的开销。这么一来的话就会存在一个“什么时候才需要关心这个差异?”的问题。如果客户端平均每秒会向服务器发送一次消息的话,那应该选择 WebSocket。如果一分钟仅 5 - 6 次的话,其实这个 差异并不大。 1.4.2SSE 技术规范SSE 规范是 HTML 5 规范的一个组成部分。该规范比较简

12、单,主要由两个部分组成: 服务端与浏览器之间的通讯协议 浏览器中可供 JavaScript 使用的 EventSource 对象 (1) 通讯协议这个通讯协议是基于纯文本的简单协议。服务器端的响应内容类型必须是 “text/event-stream”。响应文本的内容是一个8 格式的编码。 流,流是一个简单的文本流,仅支持UTF-流由不同的组成。不同间通过仅包含回车符和换行符的空行(“rn”)来 分隔。 每个可以由多行构成,每行由类型和数据两部分组成。类型与数据通过冒号(“:”) 进行分隔,冒号前的为类型,冒号后的为其对应的值。每个可以包含如下类型的行: 类型为空白,表示该行是注释,会在处理时被

13、忽略。 类型为 data,表示该行是所包含的数据。以 data 开头的行可以出现多次。所有这些行都是该的数据。 类型为 event,表示该行用来声明的类型,即名称。浏览器在收到数据时,会产生对称的。 类型为 id,表示该行用来声明的标识符。 类型为 retry,表示该行用来声明浏览器在连接断开之后进行重连的等待时间。 讲师:Rey15data: china/ 该仅包含数据 data: Beijing/ 该包含数据与标识 id: 100event: myevent/ 该指定了名称 反应式Web 开发框架WebFlux标识id 有什么用呢? 如果服务端发送的中包含标识id,那么浏览器会将最近一次接

14、收到的标识 id 记录到HTTP 头的 Last-Event-ID 属性中。如果浏览器与服务端的连接中断,当浏览器再次连接时,会将 Last-Event-ID 记录的标识id 发送给服务端。服务器端通过浏览器端发送的标识id 来确定将继续连接哪个。 (2) EventSource 对象对于服务端发送的带有的响应,浏览器需要在 JavaScript 中使用 EventSource 对象进行处理。EventSource 使用的是标准的器方式(注意,这里的并不是响应中所带的,而是浏览器上所发生的)。当相应的发生时,只需使 EventSource对象调用相应的处理方法即可。EventSource 提供

15、了三个标准 1.4.3SSE 举例创建一个普通的动态web 工程,无需其它依赖。 不过,在测试时使用的浏览器,不要使用火狐,看不到效果,可以使用谷歌。 讲师:Rey16data:shanghai id: 101: this is a comment/ 该具有注释、名称,且包含两行数据 event:citydata: guangzhou data: shenzhen 反应式Web 开发框架WebFlux(1) 定义并访问 ServletA、定义一个普通 Servlet定义该Servlet 的目的主要是用于对比,对比一下使用 SSE 前后,浏览器的区别。讲师:Rey17 反应式Web 开发框架We

16、bFluxB、 定义 SomeSseServletC、 访问 Servlet 运行测试分别在浏览器访问两个Servlet,可以看到两种不同的效果:对 CommonServlet 的访问是,浏览器会被阻塞,然后一下将所有数据显示;对 SomeSseServlet 的访问是,浏览器会逐条显示数据,未出现阻塞现象。这个逐条显示的内容即为流中的内容。 (2) 再定义并访问 ServletA、定义 OtherSseServlet仅添加了一行内容:指定名称。 讲师:Rey18 反应式Web 开发框架WebFluxB、 访问 Servlet 运行测试对OtherSseServlet 的访问是,浏览器会逐条显

17、示数据,未出现阻塞现象。与 SomeSseServlet 的访问效果相同,但流内容多了名称。 讲师:Rey19 反应式Web 开发框架WebFlux(3) 定义并访问 some.jspA、定义 some.jspB、 访问打开浏览器后,F12 打开开发者工具栏,在其中找到 Console 控制台,可看到接收到的服务端发送来的程度了。 内容。当然,对于这些数据怎么使用,那就要看程序员对于 JS 的掌握 讲师:Rey20 反应式Web 开发框架WebFlux讲师:Rey21 反应式Web 开发框架WebFlux(4) 定义并访问 other.jspA、定义 other.jspB、 访问讲师:Rey2

18、2 反应式Web 开发框架WebFlux1.5Reactive StreamRxJava 是一种反应式编程库,产生于反应式流规范之前,使用比较麻烦。 RxJava2 是对RxJava 的改进,产生于反应式流规范之后,其兼顾了反应式流规范,同时又兼容了RxJava,所以其使用起来仍不是很方便。 Reactor 是完全基于反应式流规范的、全新的反应式编程库,使用更为直观易懂。是 Spring5 中反应式编程的基础。 1.5.1Reactive Stream 概述(1) 推拉模型与背压在流处理机制中,push(推送)模型和 pull(拉取)模型是最常见的。push 模型中,发布者将元素主动推送给订阅

19、者。而 pull 模式中,订阅者会向发布者主动索要。在同步式系统中发布者与订阅者的工作效率相当,发布者发布一个消息后阻塞,等待订阅者消费。订阅者 消费完后,订阅者阻塞,等待发布者发布。这种同步式处理方式效率很低。一般使用的是异 步消息处理机制。即发布者发布消息,与消费者消费消息的速度是不一样的。那么它们间是 如何协调工作的呢? 当订阅者比发布者快时,会出现订阅者无消息可消费的情况。在同步数据处理机制中订 阅者需无限期等待,直到有消息可用。但在异步处理机制中,订阅者无需阻塞,其继续处理 其他任务即可。当出现了准备就绪的消息时,发布者会将它们异步发送给订阅者。所以,在 异步处理机制中,这种情况并不

20、会对系统性能产生影响。 当发布者比订阅者快时,有两大类解决方案。 一类解决方案是改变订阅者。要么使订阅者拥有一个无边界缓冲区来保存快速传入的消 息,要么让订阅者将它无法处理的消息丢弃。 另一类解决方案是改变发布者。这类解决方案采用的策略称为背压(BackPressure)策略。订阅者告诉发布者让其减慢发布速度并保持消息,直到订阅者准备好处理更多消息。使 用背压策略可确保较快的发布者不会压制较慢的订阅者。但该解决方案要求发布者要拥有无 限制缓冲区,以确保发布者可以一直生产和保存消息。当然,发布者也可以实现有界缓冲区 以保存有限数量的消息。但若缓冲区满,则需要放弃这些消息。不过,可以让发布者将放弃

21、 的消息再发布,直到订阅将其消费。 (2) 反应式流反应式流从 2013 年开始,作为提供非阻塞背压的异步流处理标准的倡议,旨在解决处理元素流(即消息流、数据流)的问题如何将元素流从发布者传递到订阅者,而不需要 发布者阻塞,或订阅者有无限制的缓冲区或丢弃。 反应式流模型非常简单:订阅者向发布者发送多个元素的异步请求,发布者向订阅者异 步发送多个或稍少的元素。反应式流会在 pull 模型和 push 模型流处理机制之间动态切换。当发布者快、订阅者慢时,它使用 pull 模型;当发布者慢、订阅者快时,它使用 push 模型。 即谁慢谁占主动。 讲师:Rey23 反应式Web 开发框架WebFlux

22、2015 年出版了用于处理反应式流的规范和 Java API。(3) JDK 与反应式流的关系Reactive Steam 是一种数据处理机制,是一种思想,一套解决方案。JDK 使用 Flow 类定义了这种规范,该规范中仅包含四个接口(后面讲)。这套规范最初是定义在 JDK9 中的。不过,JDK9 昙花一现,不到一年时间 Oracle 官方已经不提供 JDK9 的支持与下载了,并建议 JDK9 的用户使用JDK10,所以可以说,Reactive Stream 是 JDK10 的特性。 故,后面编程使用的Eclipse 版本要是最新版本的,例如 photon 版本的Eclipse。 1.5.2反

23、应式流接口在JDK 中 Flow 类中声明了四个反应式流接口。(1) Publisher接口Publisher,即发布者,是有序消息的生产者。它根据收到的请求向订阅者发布消息。 (2) Subscriber接口Subscriber,即订阅者,从发布者那里订阅并接收消息。发布者向订阅者发送订阅令牌 (Subscription)。使用订阅令牌,订阅者可以从发布者那里请求多个消息。当消息元素准备就绪时,发布者向订阅者发送多个或更少的元素。然后订阅者可以再次请求更多的消息元素, 或取消订阅。一个发布者可能需要处理来自多个订阅者的请求。 讲师:Rey24 反应式Web 开发框架WebFlux(3) Su

24、bscription 接口Subscription(订阅费),订阅令牌。当订阅请求成功时,发布者将其传递给订阅者。订阅 者使用订阅令牌与发布者进行交互,例如请求更多的消息元素或取消订阅。 (4) 三个接口的关系(5) Processor接口Processor,即处理器,充当订阅者和发布者的处理阶段。Processor接口继承了 Publisher和 Subscriber 接口。它用于转换发布者/订阅者管道中的元素。Processor会将来自于发布者的T 类型的消息数据,接收并转换为 R 类型的数据,并将转换后的 R 类型数据发布给订阅者。一个发布者可以拥有多个处理者。 1.5.3“发布-订阅”

25、模式反应式流编程项目:reactiveStream。 讲师:Rey25 反应式Web 开发框架WebFlux(1) 定义订阅者讲师:Rey26 反应式Web 开发框架WebFlux讲师:Rey27 反应式Web 开发框架WebFlux(2) 定义测试类讲师:Rey28 反应式Web 开发框架WebFlux1.5.4“发布-处理-订阅”模式响应流编程这里要使用处理器Processor。该处理器的处理逻辑是,将发布者发布的大于 50 的消息过滤掉,并将小于 50 的Integer 消息转换为String 后发布给订阅者。 项目:reactiveStream2。该项目直接复制前面的 reactive

26、Stream 项目,然后在前面项目基础上进行修改。 (1) 修改测试类该类中定义了发布者、处理器与订阅者,并使发布者与处理器间建立了订阅关系,使处 理器与订阅者间建立了订阅关系。 讲师:Rey29 反应式Web 开发框架WebFlux(2) 定义处理器类该类可以直接复制订阅者类,并在订阅者类基础上进行修改。主要修改了 onNext()方法及 onComplete()方法。 讲师:Rey30 反应式Web 开发框架WebFlux讲师:Rey31 反应式Web 开发框架WebFlux(3) 修改订阅者类订阅者类主要是修改了其泛型,由 Integer 修改为了 String。其它代码未变。讲师:Re

27、y32 反应式Web 开发框架WebFlux讲师:Rey33 反应式Web 开发框架WebFlux第2章 WebFlux 开发需求:通过WebFlux 实现对MongoDB 的 CRUD 操作。因为WebFlux 不支持RDBMS(关系型数据库管理系统),所以只能从 NoSQL 中选择。Redis 是键值对型的内存数据库,而 MongoDB 则与关系型数据库更为相近,其也存在表的概念。所以我们这里选择使用 MongoDB。 对于该功能的实现,采用了两种实现方式:使用传统处理器开发,与使用 Router Functions开发。 2.1使用传统处理器开发使用传统处理器开发,指的是使用Contro

28、ller 注解的类作为处理器类,使用RequestMapping 进行请求与处理器方法映射,来开发 WebFlux 的方式。 2.1.1基本结构搭建(1) 创建工程创建一个Spring Starter Project,Spring Boot 的版本要求最低为 2.0.0。不要添加原来的web 依赖,而是要添加Reactive Web,即flux 依赖,并添加上Lombok 与DevTools 依赖。另外,再添加上 Reactive MongoDB 依赖。 讲师:Rey34 反应式Web 开发框架WebFlux(2) 修改启动类讲师:Rey35 反应式Web 开发框架WebFlux(3) 定义实

29、体类MongoDB 中表的id 一般为 String 类型。(4) 定义处理器当处理器方法返回Flux 时,一般我们都会定义两种数据返回形式:一次性返回,与 SSE实时性返回。 讲师:Rey36 反应式Web 开发框架WebFlux(5) 定义 Repository 接口(6) 数据库连接配置这是访问mongoDB 的数据库连接,其中 test 为要连接的数据库名。(7) 测试使用Chrome 浏览器的Restlet Client 插件进行测试。 在提交了Get 请求后,可以看以下内容说明前面的工作成功。 讲师:Rey37 反应式Web 开发框架WebFlux讲师:Rey38 反应式Web 开

30、发框架WebFlux2.1.2CURD 的实现(1) 添加对象A、修改处理器(提交 JSON 数在定义处理器方法时首先要考虑该方法的返回值。对于执行添加操作的处理器方法,我 们可以让其返回添加成功的这个对象本身。所以,可以在处理器中添加如下处理器方法。 需要注意,在REST 协议中,添加操作需要使用 POST 请求提交方式,所以这里要使用 PostMapping 注解。 对于Spring-Data-JPA 中的save()方法需要注意,若参数对象的id 属性为Null,则 save() 为添加操作,底层执行insert into 语句;若参数对象的id 属性不为Null,则 save()为修改

31、操作,底层执行 update 语句。 B、 测试在选择了POST 提交后,在请求体BODY 中写入 JSON 数据。注意,标准的 JSON 的字符串是要由双引号括起来的,所以“张三”若不使用双引号,则请求会出错。 讲师:Rey39 反应式Web 开发框架WebFlux看到如下响应说明添加成功。 C、 修改处理器(提交 Form 表单)在处理器中添加如下处理器方法。由于数据来自于表单而非 JSON,所以参数中无需添加RequestBody。 讲师:Rey40 反应式Web 开发框架WebFluxD、测试 (2) 无状态数据删除所谓无状态删除,即指定的要删除的对象无论是否存在,其响应码均为 200

32、,我们无法 知道是否真正删除了数据。 A、修改处理器 对于执行删除操作的处理器方法,其可以是没有返回值的。Spring-Data-JPA 的 deleteById()方法是没有返回值,但在WebFlux 编程中需要将其包装为 Mono,但泛型为Void。 讲师:Rey41 反应式Web 开发框架WebFlux需要注意,在 REST 协议中,删除操作需要使用 DELETE 请求提交方式,所以这里要使用 DeleteMapping 注解。 B、 测试(删除存在的数据) a、 找到要删除的对象的 id要删除的数据的id 从哪里可以看到呢?从 Restlet 的 HISTORY 中可以查看到之前的所有

33、操作请求,找到添加数据的请求,点击后从 RESPONSE 中可以看到那次添加数据的 id。 b、删除数据 提交删除请求后,响应码为 200。讲师:Rey42 反应式Web 开发框架WebFluxC、 测试(删除不存在的数据) 将请求中的id 随便修改一下再次提交请求,其响应码仍为 200。讲师:Rey43 反应式Web 开发框架WebFlux(3) 有状态数据删除所谓有状态删除,即指若删除的对象存在,且删除成功,则返回响应码 200,否则返回响应码 404。通过响应码就可以判断删除操作是否成功。 A、修改处理器 编写该处理器的思路是:首先根据id 对该对象进行查询,若存在则先将该查询结果删除,

34、然后再将其映射为状态码 200;若不存在,则将查询结果映射为状态码 404。 对于该处理器,需要注意以下几点: ResponseEntity 可以封装响应体中所携带的数据及响应码,其泛型用于指定携带数据的类型。若响应体中没有携带数据,则泛型为 Void。本例中要返回的 ResponseEntity 中仅封装了响应码不携带任何数据,所以泛型为 Void。响应码只能采用 HttpStatus 枚举类型常量表示,这是 ResponseEntity 的构造器所要求的。 为什么做映射时使用flatMap(),不使用map()?首先这两个方法都是 Mono 的方法,不是 Stream 的方法,与 Stre

35、am 的两个同名方法无关,但均是做映射的。若需要对对象数据先执行操作后再做映射,则使用flatMap();若纯粹是一种数据映射,没有数据操作, 则使用map()。 在Mono 的访求中,对于没有返回值的方法,若想为其添加返回值,则可链式调用 then()讲师:Rey44 反应式Web 开发框架WebFlux方法,由 then()方法返回想返回的值。对于本例,由于 Spring-Data-JPA 的 delete()方法没有返回值,所以这里使用then()为其添加返回值。 B、 测试(删除存在的数据) 讲师:Rey45 反应式Web 开发框架WebFluxC、 测试(删除不存在的数据) 再次提交

36、前面的删除请求即可,因为该对象已经在上次请求时被删除了。 (4) 修改数据需要注意,在REST 协议中,修改操作需要使用 PUT 请求提交方式,所以这里要使用PutMapping 注解。 A、修改处理器 对于执行修改操作的处理器方法,我们可以这定义其返回值:若修改成功,则返回修改 后的对象数据;若指定的id 对象不存在,则返回 404。 讲师:Rey46 反应式Web 开发框架WebFluxB、 测试(修改存在的数据) 首先插入一条新的数据,查看其 id 及其它属性值。这里准备要将其修改为“李四”“24”。 讲师:Rey47 反应式Web 开发框架WebFlux提交修改该对象的请求,查看修改后

37、的结果,发现 id 未变,但数据已经变化,且响应码为 200。 C、 测试(对于不存在的数据提交修改) 将请求中的id 随意修改为不存在的id,然后提交修改请求,可以看到响应码为 404。 讲师:Rey48 反应式Web 开发框架WebFlux(5) 根据 id 查询需要注意,在REST 协议中,查询操作需要使用 GET 请求提交方式,所以这里要使用GetMapping 注解。 A、修改处理器 对于执行根据id 进行查询操作的处理器方法,我们可以这定义其返回值:若有查询结 果,则返回查询到的对象数据;若没有查询结果,则返回 404。 讲师:Rey49 反应式Web 开发框架WebFluxB、

38、测试(查找存在的对象) 复制一个刚完成插入操作的对象的 id 进行查询。C、 测试(查询不存在的对象) 随意修改查询请求中的id 后进行查询。 讲师:Rey50 反应式Web 开发框架WebFlux(6) 根据年龄上下限查询前面的查询,要么是查询所有,与字段无关,要么是根据 id 查询,而id 属性属于业务无关属性。这些查询在Spring-Data-JPA 的Repository 接口中已经定义好了,可以直接使用。但就像根据姓名、年龄等字段进行查询,Repository 接口中就不可能事先定义好,因为这些字段属性业务相关字段,Repository 接口不可能事先知道当前业务中都具有哪些字段。所

39、以,这些业务相关字段的查询,需要程序员在自定义的 Repository 接口中自己声明,然后 Spring-Data-JPA 会根据指定的字段名称自动实现该方法。 A、修改 StudentRepository 接口在其中添加一个抽象方法。 讲师:Rey51 反应式Web 开发框架WebFluxB、 修改处理器讲师:Rey52 反应式Web 开发框架WebFluxC、 测试(一次性返回)讲师:Rey53 反应式Web 开发框架WebFluxD、测试(实时性返回) (7) 使用 MongoDB 的原始查询语句A、回顾 MongoDB 的原始操在命令行窗口中何意目录下键入 mongo 命令,打开Mo

40、ngo Shell 窗口。讲师:Rey54 反应式Web 开发框架WebFlux查看指定表中的所有数据。 放大后为:讲师:Rey55 反应式Web 开发框架WebFlux查寻年龄大于等于 22 且小于等于 28 的所有学生。B、 修改 StudentRepository 接口在接口中添加如下抽象方法。 讲师:Rey56 反应式Web 开发框架WebFluxC、 修改处理器讲师:Rey57 反应式Web 开发框架WebFluxD、测试(一次性返回) 讲师:Rey58 反应式Web 开发框架WebFluxE、 测试(实时性返回)2.1.3参数校验为了保证数据在进入到业务运算时的正确性,一般我们会对

41、参数首先进行校验。例如, 我们需要使 Student 的name 值不能是admin 或administrator,则可自己定义校验逻辑。 讲师:Rey59 反应式Web 开发框架WebFlux(1) 自定义校验逻辑A、定义异常类 B、 定义校验工具类讲师:Rey60 反应式Web 开发框架WebFluxC、 修改校验切面在校验切面类中添加如下异常处理方法。 D、修改处理器 修改具有Student 类型参数的处理器方法,即两个添加数据方法,及修改数据方法,在其中添加校验代码。 讲师:Rey61 反应式Web 开发框架WebFluxE、 测试无论测试添加功能还是修改功能,只要提交的姓名不合法,则

42、响应就会给出具体的异常 详情。 讲师:Rey62 反应式Web 开发框架WebFlux(2) 使用 Hibernate 注解校验Hibernate Validator 中已经定义好了很多通用的校验注解,我们可以直接使用。A、代码中添加注解 a、 修改实体类 Student在要验证的属性上添加相应注解。 讲师:Rey63 反应式Web 开发框架WebFluxb、修改处理器 修改具有Student 类型参数的处理器方法,即两个添加数据方法,及修改数据方法的参数上添加Valide 注解。 c、 测试 测试添加与修改。提交正常数据,运行成功,返回码 200。 讲师:Rey64 反应式Web 开发框架W

43、ebFlux讲师:Rey65 反应式Web 开发框架WebFlux讲师:Rey66 反应式Web 开发框架WebFluxB、 添加校验切面前面验证失败的结果是 400 异常,但并没有指出是哪个属性出现了异常,出现了什么异常。即前面校验注解中的校验异常信息并没有显示。可以通过添加切面的方式给出校验异常 详情。 a、 添加切面类 对于该切面类的定义,需要注意以下几点: 由于getFieldErrors()方法获取到的是一个 List 集合,所以 stream()后的流就是一个集合数据流,且集合元素常对象。 map()方法用于将集合数据流中的每一个元素,即异常对象映射为字符串形式:发生异 常的属性名

44、 加 指定的异常信息。 map()的最终结果仍为一个集合流,只不过集合流中的元素由异常对象变为了字符串。 但这里需要的最终结果不是字符串集合,而是一个字符串,所以需要使用 reduce()将集合流缩减为一个字符串。 reduce()的第一个参数为默认值,即在流中元素为空时所使用的值,可以避免异常的抛 出。第二个参数为BinaryOperator,两个输入一个输出,且类型相同。由两个输入最终 变为了一个输出,就达到了缩减 reduce 的效果了。 讲师:Rey67 反应式Web 开发框架WebFluxb、测试 无论测试添加功能还是修改功能,只要提交的数据不合法,则响应就会给出具体的异常 详情。

45、讲师:Rey68 反应式Web 开发框架WebFluxC、 常用 Hibernate 校验注解每一个 Hibernate 校验注解均有一个 message 属性,用于设置验证失败后的提示信息。讲师:Rey69注解 适用的数据类型 说明 AssertFalse Boolean, boolean 验证注解的元素值是false AssertTrue Boolean, boolean 验证注解的元素值是true DecimalMax (value=x) BigDecimal, BigInteger, String, byte,short, int, long and the respective wr

46、appers of the primitive types. Additionally supported by HV: any sub-type of Number andCharSequence. 验证注解的元素值小于等于 DecimalMax 指定的value 值 DecimalMin (value=x) BigDecimal, BigInteger, String, byte,short, int, long and the respective wrappers of the primitive types. Additionally supported by HV: any sub

47、-type of Number andCharSequence. 验证注解的元素值小于等于 DecimalMin 指定的value 值 Digits(integer= 整 数 位 数 , fraction=小数位数) BigDecimal, BigInteger, String, byte,short, int, long and the respective wrappers of the primitive types. Additionally supported by HV: any sub-type of Number andCharSequence. 验证注解的元素值的整数位数和小

48、数位数上限 反应式Web 开发框架WebFlux讲师:Rey70Future java.util.Date, java.util.Calendar; Additionally supported by HV, if theJoda Time date/time API is on the class path: any implementations ofReadablePartial andReadableInstant. 验证注解的元素值(日期类型)比当前时间晚 Max(value=x) BigDecimal, BigInteger, byte, short,int, long and t

49、he respective wrappers of the primitive types. Additionally supported by HV: any sub-type ofCharSequence (the numeric value represented by the character sequence is evaluated), any sub-type of Number. 验证注解的元素值小于等于Max 指定的value 值 Min(value=x) BigDecimal, BigInteger, byte, short,int, long and the respe

50、ctive wrappers of the primitive types. Additionally supported by HV: any sub-type of CharSequence (the numeric value represented by the char sequence is evaluated), any sub-type of Number. 验证注解的元素值大于等于Min 指定的value 值 NotNull Any type 验证注解的元素值不是 null Null Any type 验证注解的元素值是null Past java.util.Date, ja

51、va.util.Calendar; Additionally supported by HV, if theJoda Time date/time API is on the class path: any implementations ofReadablePartial andReadableInstant. 验证注解的元素值(日期类型)比当前时间早 Pattern(regex= 正则表达式, flag=) String. Additionally supported by HV: any sub-type of CharSequence. 验证注解的元素值与指定的正则表达式匹配 Size(min=最小 值, max=最大值) String, Collection, Map and arrays. Additionally supported by HV: any sub-type of CharSequence. 验证注解的元素值的在min 和max(包含) 指定区间之内,如字符长度、集合大小 Valid Any non-primitive type(引用类型) 验证关联的对象,如账户对象里有一个订单 反应式Web 开发框架WebFlux2.2使用 Router Functions 开发使用Rout

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论