对于最新的稳定版本,请使用 Spring Framework 7.0.6!spring-doc.cadn.net.cn

DispatcherHandler

Spring WebFlux,类似于Spring MVC,是围绕前端控制器模式设计的, 其中中央WebHandler,即DispatcherHandler,为请求处理提供了一个共享算法, 而实际工作由可配置的委托组件完成。这种模型非常灵活,支持多种工作流程。spring-doc.cadn.net.cn

DispatcherHandler 从 Spring 配置中发现它需要的委托组件。 它也被设计为一个 Spring bean,并实现了 ApplicationContextAware, 以便访问其运行的上下文。如果 DispatcherHandler 声明为具有 bean 名称 webHandler, 则它反过来会被 WebHttpHandlerBuilder 发现, 后者将组件组合成一个请求处理链,如 WebHandler API 中所述。spring-doc.cadn.net.cn

在WebFlux应用程序中,Spring配置通常包含:spring-doc.cadn.net.cn

配置被赋予WebHttpHandlerBuilder以构建处理链, 如下例所示:spring-doc.cadn.net.cn

ApplicationContext context = ...
HttpHandler handler = WebHttpHandlerBuilder.applicationContext(context).build();
val context: ApplicationContext = ...
val handler = WebHttpHandlerBuilder.applicationContext(context).build()

结果的 HttpHandler 已准备好与 服务器适配器 一起使用。spring-doc.cadn.net.cn

特殊bean类型

The DispatcherHandler 委托给特殊 bean 来处理请求并渲染适当的响应。所谓的“特殊 bean”是指实现了 WebFlux 框架契约的 Spring 管理的 Object 实例。这些通常带有内置契约,但您可以自定义它们的属性、扩展它们或替换它们。spring-doc.cadn.net.cn

以下表格列出了由DispatcherHandler检测到的特殊bean。请注意,还有一些在较低级别检测到的其他bean(请参见Web Handler API中的特殊bean类型)。spring-doc.cadn.net.cn

Beans类型 说明

HandlerMappingspring-doc.cadn.net.cn

将请求映射到处理器。映射基于某些标准,具体细节因HandlerMapping实现而异——注解控制器、简单的URL模式映射等。spring-doc.cadn.net.cn

主要的HandlerMapping实现包括RequestMappingHandlerMapping用于注解方法,RouterFunctionMapping用于功能性端点路由,以及SimpleUrlHandlerMapping用于显式注册URI路径模式和WebHandler实例。spring-doc.cadn.net.cn

HandlerAdapterspring-doc.cadn.net.cn

帮助DispatcherHandler调用映射到请求的处理器,而无需考虑处理器实际是如何被调用的。例如,调用一个注解控制器需要解析注解。HandlerAdapter的主要目的是屏蔽DispatcherHandler这样的细节。spring-doc.cadn.net.cn

HandlerResultHandlerspring-doc.cadn.net.cn

处理处理器调用的结果并最终确定响应。 见结果处理spring-doc.cadn.net.cn

WebFlux配置

应用程序可以声明处理请求所需的基础设施bean(列在Web Handler APIDispatcherHandler下)。但是,在大多数情况下,WebFlux Config是最好的起点。它声明了所需的bean,并提供了一个更高层次的配置回调API来定制它。spring-doc.cadn.net.cn

Spring Boot 依赖于 WebFlux 配置来配置 Spring WebFlux,并且还提供了许多额外的便捷选项。

处理

DispatcherHandler 处理请求如下:spring-doc.cadn.net.cn

  • 每个 HandlerMapping 都会被要求找到一个匹配的处理器,并且使用第一个匹配项。spring-doc.cadn.net.cn

  • 如果找到了处理器,它将通过适当的HandlerAdapter运行,该HandlerAdapter会将执行的返回值暴露为HandlerResultspring-doc.cadn.net.cn

  • The HandlerResult is given to an appropriate HandlerResultHandler to complete processing by writing to the response directly or by using a view to render.spring-doc.cadn.net.cn

结果处理

通过调用处理器返回的值,通过一个HandlerAdapter,被包装为一个HandlerResult,并附带一些额外的上下文信息,传递给第一个声明支持它的HandlerResultHandler。下表列出了可用的HandlerResultHandler实现,所有这些实现都在WebFlux Config中声明:spring-doc.cadn.net.cn

结果处理器类型 返回值 默认顺序

ResponseEntityResultHandlerspring-doc.cadn.net.cn

ResponseEntity, 通常来自 @Controller 个实例。spring-doc.cadn.net.cn

0spring-doc.cadn.net.cn

ServerResponseResultHandlerspring-doc.cadn.net.cn

ServerResponse, 通常来自功能性端点。spring-doc.cadn.net.cn

0spring-doc.cadn.net.cn

ResponseBodyResultHandlerspring-doc.cadn.net.cn

处理从 @ResponseBody 方法或 @RestController 类返回的值。spring-doc.cadn.net.cn

100spring-doc.cadn.net.cn

ViewResolutionResultHandlerspring-doc.cadn.net.cn

CharSequence, View, 模型, Map, 渲染, 或任何其他 Object 被视为模型属性。spring-doc.cadn.net.cn

另请参见 查看解决方案spring-doc.cadn.net.cn

Integer.MAX_VALUEspring-doc.cadn.net.cn

异常

HandlerAdapter 实现可以在内部处理来自调用请求处理器(例如控制器方法)的异常。但是,如果请求处理器返回异步值,则异常可能会被延迟。spring-doc.cadn.net.cn

HandlerAdapter 可能会将其异常处理机制公开为返回的 HandlerResult 上的一个 DispatchExceptionHandler 集合。当设置了该机制时,DispatcherHandler 也会将其应用于结果的处理过程。spring-doc.cadn.net.cn

HandlerAdapter 也可以选择实现 DispatchExceptionHandler。在这种情况下,DispatcherHandler 会将其应用于处理器映射之前出现的异常,例如在映射处理器期间或更早,例如在 WebFilter 中。spring-doc.cadn.net.cn

另请参阅 异常处理 章节中的“Annotated Controller”部分或 WebHandler API 部分的异常处理章节。spring-doc.cadn.net.cn

视图解析

视图解析功能允许使用HTML模板和模型向浏览器呈现,而无需绑定到特定的视图技术。在Spring WebFlux中,视图解析通过专用的HandlerResultHandler支持,该处理器使用ViewResolver实例将字符串(表示逻辑视图名称)映射到View实例。View然后用于渲染响应。spring-doc.cadn.net.cn

处理

传递给 ViewResolutionResultHandlerHandlerResult 包含处理器返回的值以及在请求处理期间添加的属性的模型。返回值将按以下方式之一进行处理:spring-doc.cadn.net.cn

  • String, CharSequence: 一个逻辑视图名称,通过配置的ViewResolver实现列表解析为Viewspring-doc.cadn.net.cn

  • void: 根据请求路径选择一个默认视图名称,去掉前导和尾随斜杠,并将其解析为View。当未提供视图名称时(例如,返回了模型属性)或异步返回值为空时(例如,Mono完成为空),也会发生同样的情况。spring-doc.cadn.net.cn

  • 渲染: API 用于视图解析场景。在您的 IDE 中使用代码补全来探索选项。spring-doc.cadn.net.cn

  • Model, Map: 为请求添加到模型中的额外模型属性。spring-doc.cadn.net.cn

  • 其他任何:其他任何返回值(除了简单类型,由 BeanUtils#isSimpleProperty 确定) 被视为要添加到模型中的模型属性。属性名称通过使用 约定 从类名派生, 除非存在带有 @ModelAttribute 注解的处理器方法。spring-doc.cadn.net.cn

模型可以包含异步、响应式类型(例如,来自Reactor或RxJava)。在渲染之前,AbstractView将这些模型属性解析为具体值并更新模型。单值响应式类型被解析为单个值或无值(如果为空),而多值响应式类型(例如,Flux<T>)被收集并解析为List<T>spring-doc.cadn.net.cn

要配置视图解析,只需在您的Spring配置中添加一个ViewResolutionResultHandler bean。WebFlux 配置提供了一个专门的配置API用于视图解析。spring-doc.cadn.net.cn

See 视图技术 for more on the view technologies integrated with Spring WebFlux.spring-doc.cadn.net.cn

重定向

特殊前缀 redirect: 在视图名称中允许你执行重定向。UrlBasedViewResolver(及其子类)将此识别为需要重定向的指令。视图名称的其余部分是重定向URL。spring-doc.cadn.net.cn

最终效果与控制器返回RedirectViewRendering.redirectTo("abc").build()相同,但现在控制器本身可以在逻辑视图名称的术语下操作。像redirect:/some/resource这样的视图名称相对于当前应用程序,而像redirect:https://example.com/arbitrary/path这样的视图名称重定向到绝对URL。spring-doc.cadn.net.cn

内容协商

ViewResolutionResultHandler 支持内容协商。它将请求的媒体类型与每个选定 View 支持的媒体类型进行比较。首先使用支持请求的媒体类型(s) 的 Viewspring-doc.cadn.net.cn

为了支持JSON和XML等媒体类型,Spring WebFlux提供了HttpMessageWriterView,这是一种特殊的View,通过HttpMessageWriter进行渲染。通常,您会通过WebFlux配置将这些配置为默认视图。如果匹配请求的媒体类型,默认视图总是被选择和使用。spring-doc.cadn.net.cn