DispatcherHandler

Spring WebFlux,與 Spring MVC 類似,圍繞前端控制器模式設計,其中一箇中央 WebHandler,即 DispatcherHandler,提供了一個共享的請求處理演算法,而實際工作由可配置的委託元件執行。此模型靈活,並支援各種工作流。

DispatcherHandler 從 Spring 配置中發現其所需的委託元件。它也被設計為一個 Spring bean,並實現了 ApplicationContextAware 以訪問其執行的上下文。如果 DispatcherHandler 以 bean 名稱 webHandler 宣告,則它將依次被 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 委託給特殊 bean 來處理請求並呈現適當的響應。 “特殊 bean”指的是實現 WebFlux 框架約定的 Spring 管理的 Object 例項。這些通常帶有內建約定,但您可以自定義它們的屬性、擴充套件它們或替換它們。

下表列出了 DispatcherHandler 檢測到的特殊 bean。請注意,還有一些在較低級別檢測到的其他 bean(請參閱 Web Handler API 中的 特殊 bean 型別)。

Bean 型別 解釋

HandlerMapping

將請求對映到處理程式。對映基於某些標準,具體細節因 HandlerMapping 實現而異——帶註解的控制器、簡單的 URL 模式對映等。

主要的 HandlerMapping 實現是用於 @RequestMapping 註解方法的 RequestMappingHandlerMapping,用於函式式端點路由的 RouterFunctionMapping,以及用於 URI 路徑模式和 WebHandler 例項顯式註冊的 SimpleUrlHandlerMapping

HandlerAdapter

幫助 DispatcherHandler 呼叫對映到請求的處理程式,而不管處理程式實際如何呼叫。例如,呼叫帶註解的控制器需要解析註解。HandlerAdapter 的主要目的是保護 DispatcherHandler 免受此類細節的影響。

HandlerResultHandler

處理處理程式呼叫的結果並完成響應。請參閱結果處理

WebFlux 配置

應用程式可以宣告處理請求所需的基礎設施 bean(列在Web Handler APIDispatcherHandler 下)。但是,在大多數情況下,WebFlux 配置是最佳起點。它聲明瞭所需的 bean 並提供了更高級別的配置回撥 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 渲染響應。

Web 應用程式需要使用檢視渲染庫來支援此用例。

處理

傳遞給 ViewResolutionResultHandlerHandlerResult 包含來自處理程式的返回值和在請求處理期間添加了屬性的模型。返回值按以下方式之一處理

  • StringCharSequence:要透過配置的 ViewResolver 實現列表解析為 View 的邏輯檢視名稱。

  • void:根據請求路徑選擇預設檢視名稱(減去前導和尾隨斜槓),並將其解析為 View。當未提供檢視名稱(例如,返回模型屬性)或非同步返回值(例如,Mono 完成為空)時,也會發生同樣的情況。

  • Rendering:用於檢視解析場景的 API。在 IDE 中使用程式碼補全探索選項。

  • ModelMap:要新增到請求模型的額外模型屬性。

  • 任何其他:任何其他返回值(除了由 BeanUtils#isSimpleProperty 確定的簡單型別)都被視為要新增到模型中的模型屬性。屬性名稱透過約定從類名派生,除非存在處理程式方法 @ModelAttribute 註解。

模型可以包含非同步、響應式型別(例如,來自 Reactor 或 RxJava)。在渲染之前,AbstractView 將此類模型屬性解析為具體值並更新模型。單值響應式型別解析為單個值或無值(如果為空),而多值響應式型別(例如,Flux<T>)被收集並解析為 List<T>

配置檢視解析就像向 Spring 配置中新增一個 ViewResolutionResultHandler bean 一樣簡單。WebFlux 配置為檢視解析提供了專用的配置 API。

有關與 Spring WebFlux 整合的檢視技術的更多資訊,請參閱檢視技術

重定向

檢視名稱中特殊的 redirect: 字首允許您執行重定向。UrlBasedViewResolver(及其子類)將其識別為需要重定向的指令。檢視名稱的其餘部分是重定向 URL。

效果與控制器返回 RedirectViewRendering.redirectTo("abc").build() 相同,但現在控制器本身可以根據邏輯檢視名稱進行操作。像 redirect:/some/resource 這樣的檢視名稱是相對於當前應用程式的,而像 redirect:https://example.com/arbitrary/path 這樣的檢視名稱則重定向到絕對 URL。

與 Servlet 堆疊不同,Spring WebFlux 不支援“轉發”排程,因此不支援 forward: 字首。

內容協商

ViewResolutionResultHandler 支援內容協商。它將請求媒體型別與每個選定 View 支援的媒體型別進行比較。使用第一個支援請求媒體型別的 View

為了支援 JSON 和 XML 等媒體型別,Spring WebFlux 提供了 HttpMessageWriterView,這是一個特殊的 View,它透過 HttpMessageWriter 渲染。通常,您會透過 WebFlux 配置將這些配置為預設檢視。如果預設檢視與請求的媒體型別匹配,則始終會選擇並使用它們。

© . This site is unofficial and not affiliated with VMware.