DispatcherHandler

Spring WebFlux与Spring MVC类似,都是围绕前端控制器模式设计的,其中一个中心的WebHandler,即DispatcherHandler,提供了一个共享的请求处理算法,实际工作由可配置的委托组件执行。这种模型灵活,支持各种工作流程。

DispatcherHandler从Spring配置中发现它需要的委托组件。它也被设计为一个Spring bean,并实现了ApplicationContextAware接口,以便访问它运行的上下文。如果将DispatcherHandler声明为webHandler的bean名称,则它将被WebHttpHandlerBuilder发现,后者组装请求处理链,如WebHandler API中描述的那样。

WebFlux应用程序中的Spring配置通常包含:

WebHttpHandlerBuilder以构建处理链,如下例所示:

  • Java

  • Kotlin

ApplicationContext context = ...
HttpHandler handler = WebHttpHandlerBuilder.applicationContext(context).build();
val context: ApplicationContext = ...
val handler = WebHttpHandlerBuilder.applicationContext(context).build()
HttpHandler已准备好与 服务器适配器一起使用。

特殊Bean类型

DispatcherHandler委托特殊的beans来处理请求并渲染适当的响应。这里所说的“特殊beans”是指实现WebFlux框架合同的由Spring管理的Object实例。这些通常带有内置合同,但您可以自定义它们的属性,扩展它们或替换它们。

DispatcherHandler检测到的特殊beans。请注意,还有一些其他beans在较低级别被检测到(请参阅 Web Handler API中的特殊bean类型)。

Bean类型 解释

HandlerMapping

将请求映射到处理程序。映射基于一些标准,具体细节因HandlerMapping实现而异 - 注解控制器、简单的URL模式映射等。

主要的HandlerMapping实现包括RequestMappingHandlerMapping用于@RequestMapping注解方法,RouterFunctionMapping用于功能端点路由,SimpleUrlHandlerMapping用于URI路径模式和WebHandler实例的显式注册。

HandlerAdapter

帮助DispatcherHandler调用与请求匹配的处理程序,无论处理程序实际如何调用。例如,调用注解控制器需要解析注解。HandlerAdapter的主要目的是保护DispatcherHandler免受这些细节的影响。

HandlerResultHandler

处理处理程序调用的结果并完成响应。请参阅结果处理

WebFlux配置

Web Handler APIDispatcherHandler下),但在大多数情况下, WebFlux配置是最佳的起点。它声明了所需的beans并提供了一个更高级别的配置回调API来自定义它。

Spring Boot依赖于WebFlux配置来配置Spring WebFlux,并提供许多额外便利选项。

处理

DispatcherHandler处理请求的步骤如下:

  • HandlerMapping被要求查找匹配的处理程序,并使用第一个匹配项。

  • HandlerAdapter运行它,该适配器将执行的返回值公开为 HandlerResult

  • HandlerResult被传递给适当的HandlerResultHandler,通过直接写入响应或使用视图进行渲染来完成处理。

结果处理

通过HandlerAdapter调用处理程序的返回值被包装为HandlerResult,连同一些额外的上下文一起传递给第一个声称支持它的HandlerResultHandler。以下表格显示了可用的HandlerResultHandler实现,所有这些都在WebFlux配置中声明:

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

ResponseEntityResultHandler

ResponseEntity,通常来自@Controller实例。

0

ServerResponseResultHandler

ServerResponse,通常来自功能性端点。

0

ResponseBodyResultHandler

处理@ResponseBody方法或@RestController类的返回值。

100

ViewResolutionResultHandler

CharSequenceViewModelMapRendering,或任何其他Object都被视为模型属性。

另请参阅视图解析

Integer.MAX_VALUE

异常

HandlerAdapter实现可以处理从调用请求处理程序(例如控制器方法)中内部引发的异常。但是,如果请求处理程序返回异步值,则可能会推迟异常。

HandlerAdapter可以将其异常处理机制公开为设置在其返回的HandlerResult上的DispatchExceptionHandler。设置了这个后,DispatcherHandler也会将其应用于结果的处理。

HandlerAdapter也可以选择实现DispatchExceptionHandler。在这种情况下,DispatcherHandler将其应用于在映射处理程序之前出现的异常,例如在处理程序映射期间或更早的阶段,例如在WebFilter中。

另请参阅“注解控制器”部分中的异常或WebHandler API部分中的异常

视图解析

视图解析使您能够使用HTML模板和模型向浏览器呈现,而不将您限制在特定的视图技术上。在Spring WebFlux中,视图解析通过专用的HandlerResultHandler支持,该处理程序使用ViewResolver实例将表示逻辑视图名称的字符串映射到View实例。然后使用View来呈现响应。

处理

ViewResolutionResultHandlerHandlerResult包含处理程序的返回值和在请求处理期间添加的模型属性。返回值被处理为以下之一:

  • StringCharSequence:要通过配置的ViewResolver实现列表解析为View的逻辑视图名称。

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

  • Rendering:用于视图解析场景的API。使用代码补全在您的IDE中探索选项。

  • ModelMap:要添加到请求的模型中的额外模型属性。

  • 其他任何值:任何其他返回值(除了由BeanUtils#isSimpleProperty确定的简单类型)都被视为要添加到模型中的模型属性。属性名称是通过约定从类名派生的,除非存在处理程序方法的@ModelAttribute注解。

AbstractView将这些模型属性解析为具体值并更新模型。单值反应式类型解析为单个值或无值(如果为空),而多值反应式类型(例如, Flux<T>)将被收集并解析为 List<T>

ViewResolutionResultHandler bean一样简单。 WebFlux配置提供了专用的配置API用于视图解析。

视图技术。

重定向

redirect:前缀允许您执行重定向。 UrlBasedViewResolver(及其子类)将其识别为需要重定向的指令。视图名称的其余部分是重定向URL。

RedirectViewRendering.redirectTo("abc").build()相同,但现在控制器本身可以根据逻辑视图名称操作。例如,视图名称 redirect:/some/resource是相对于当前应用程序的,而视图名称 redirect:https://example.com/arbitrary/path会重定向到绝对URL。

内容协商

ViewResolutionResultHandler支持内容协商。它将请求媒体类型与每个选定View支持的媒体类型进行比较。使用支持请求的媒体类型的第一个View

HttpMessageWriterView,这是一个特殊的 View,通过 HttpMessageWriter进行呈现。通常,您会将这些配置为通过 WebFlux配置作为默认视图。如果默认视图与请求的媒体类型匹配,则始终选择并使用默认视图。