DispatcherHandler
Spring WebFlux与Spring MVC类似,都是围绕前端控制器模式设计的,其中一个中心的WebHandler
,即DispatcherHandler
,提供了一个共享的请求处理算法,实际工作由可配置的委托组件执行。这种模型灵活,支持各种工作流程。
DispatcherHandler
从Spring配置中发现它需要的委托组件。它也被设计为一个Spring bean,并实现了ApplicationContextAware
接口,以便访问它运行的上下文。如果将DispatcherHandler
声明为webHandler
的bean名称,则它将被WebHttpHandlerBuilder
发现,后者组装请求处理链,如WebHandler
API中描述的那样。
WebFlux应用程序中的Spring配置通常包含:
-
DispatcherHandler
,bean名称为webHandler
-
WebFilter
和WebExceptionHandler
beans -
其他
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类型 | 解释 |
---|---|
|
将请求映射到处理程序。映射基于一些标准,具体细节因 主要的 |
|
帮助 |
|
处理处理程序调用的结果并完成响应。请参阅结果处理。 |
WebFlux配置
Web Handler API和
DispatcherHandler
下),但在大多数情况下,
WebFlux配置是最佳的起点。它声明了所需的beans并提供了一个更高级别的配置回调API来自定义它。
Spring Boot依赖于WebFlux配置来配置Spring WebFlux,并提供许多额外便利选项。 |
处理
DispatcherHandler
处理请求的步骤如下:
HandlerMapping
被要求查找匹配的处理程序,并使用第一个匹配项。HandlerAdapter
运行它,该适配器将执行的返回值公开为HandlerResult
。-
HandlerResult
被传递给适当的HandlerResultHandler
,通过直接写入响应或使用视图进行渲染来完成处理。
结果处理
通过HandlerAdapter
调用处理程序的返回值被包装为HandlerResult
,连同一些额外的上下文一起传递给第一个声称支持它的HandlerResultHandler
。以下表格显示了可用的HandlerResultHandler
实现,所有这些都在WebFlux配置中声明:
结果处理程序类型 | 返回值 | 默认顺序 |
---|---|---|
|
|
0 |
|
|
0 |
|
处理 |
100 |
|
另请参阅视图解析。 |
|
异常
HandlerAdapter
实现可以处理从调用请求处理程序(例如控制器方法)中内部引发的异常。但是,如果请求处理程序返回异步值,则可能会推迟异常。
HandlerAdapter
可以将其异常处理机制公开为设置在其返回的HandlerResult
上的DispatchExceptionHandler
。设置了这个后,DispatcherHandler
也会将其应用于结果的处理。
HandlerAdapter
也可以选择实现DispatchExceptionHandler
。在这种情况下,DispatcherHandler
将其应用于在映射处理程序之前出现的异常,例如在处理程序映射期间或更早的阶段,例如在WebFilter
中。
视图解析
视图解析使您能够使用HTML模板和模型向浏览器呈现,而不将您限制在特定的视图技术上。在Spring WebFlux中,视图解析通过专用的HandlerResultHandler支持,该处理程序使用ViewResolver
实例将表示逻辑视图名称的字符串映射到View
实例。然后使用View
来呈现响应。
处理
ViewResolutionResultHandler
的
HandlerResult
包含处理程序的返回值和在请求处理期间添加的模型属性。返回值被处理为以下之一:
-
String
,CharSequence
:要通过配置的ViewResolver
实现列表解析为View
的逻辑视图名称。 -
void
:根据请求路径选择默认视图名称,减去前导和尾随斜杠,并将其解析为View
。当未提供视图名称时(例如,返回了模型属性)或异步返回值时(例如,Mono
完成为空),也会发生相同情况。 -
Rendering:用于视图解析场景的API。使用代码补全在您的IDE中探索选项。
-
Model
,Map
:要添加到请求的模型中的额外模型属性。 -
其他任何值:任何其他返回值(除了由BeanUtils#isSimpleProperty确定的简单类型)都被视为要添加到模型中的模型属性。属性名称是通过约定从类名派生的,除非存在处理程序方法的
@ModelAttribute
注解。
AbstractView
将这些模型属性解析为具体值并更新模型。单值反应式类型解析为单个值或无值(如果为空),而多值反应式类型(例如,
Flux<T>
)将被收集并解析为
List<T>
。
ViewResolutionResultHandler
bean一样简单。
WebFlux配置提供了专用的配置API用于视图解析。
视图技术。
重定向
redirect:
前缀允许您执行重定向。
UrlBasedViewResolver
(及其子类)将其识别为需要重定向的指令。视图名称的其余部分是重定向URL。
RedirectView
或
Rendering.redirectTo("abc").build()
相同,但现在控制器本身可以根据逻辑视图名称操作。例如,视图名称
redirect:/some/resource
是相对于当前应用程序的,而视图名称
redirect:https://example.com/arbitrary/path
会重定向到绝对URL。
内容协商
ViewResolutionResultHandler
支持内容协商。它将请求媒体类型与每个选定View
支持的媒体类型进行比较。使用支持请求的媒体类型的第一个View
。
HttpMessageWriterView,这是一个特殊的
View
,通过
HttpMessageWriter
进行呈现。通常,您会将这些配置为通过
WebFlux配置作为默认视图。如果默认视图与请求的媒体类型匹配,则始终选择并使用默认视图。