SpringBoot中文參考指南(2.1.6)29.2 Spring WebFlux 框架

下一篇[未完待續]

SpringBoot中文參考指南(2.1.6)29.2 Spring WebFlux 框架

<code>英文原文:https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-developing-web-applications.html#boot-features-developing-web-applications/<code>
<code>GitHub:https://github.com/jijicai/Spring/tree/master/spring-boot/<code>

29.2 Spring WebFlux 框架

Spring WebFlux 是 Spring Framework 5.0 中引入的新的反應式 web 框架。與 Spring MVC 不同,它不需要 Servlet API ,完全異步且非阻塞,並通過 Reactor 項目實現反應式流規範。

Spring WebFlux 有兩種風格:函數式和基於註解的。基於註解的模型非常接近 Spring MVC 模型,如下面示例所示:

SpringBoot中文參考指南(2.1.6)29.2 Spring WebFlux 框架

<code>@RestController@RequestMapping("/users")public class MyRestController {    @GetMapping("/{user}")    public Mono<user> getUser(@PathVariable Long user) {        // ...    }    @GetMapping("/{user}/customers")    public Flux<customer> getUserCustomers(@PathVariable Long user) {        // ...    }    @DeleteMapping("/{user}")    public Mono<user> deleteUser(@PathVariable Long user) {        // ...    }}/<user>/<customer>/<user>/<code>

函數變體“WebFlux.fn”將路由配置與請求的實際處理分離,如下面示例所示:

SpringBoot中文參考指南(2.1.6)29.2 Spring WebFlux 框架

<code>@Configurationpublic class RoutingConfiguration {    @Bean    public RouterFunction<serverresponse> monoRouterFunction(UserHandler userHandler) {        return route(GET("/{user}").and(accept(APPLICATION_JSON)), userHandler::getUser)                .andRoute(GET("/{user}/customers").and(accept(APPLICATION_JSON)), userHandler::getUserCustomers)                .andRoute(DELETE("/{user}").and(accept(APPLICATION_JSON)), userHandler::deleteUser);    }}@Componentpublic class UserHandler {    public Mono<serverresponse> getUser(ServerRequest request) {        // ...    }    public Mono<serverresponse> getUserCustomers(ServerRequest request) {        // ...    }    public Mono<serverresponse> deleteUser(ServerRequest request) {        // ...    }}/<serverresponse>/<serverresponse>/<serverresponse>/<serverresponse>/<code>

WebFlux 是 Spring 框架的一部分,其參考文檔中提供了詳細信息。(https://docs.spring.io/spring/docs/5.1.8.RELEASE/spring-framework-reference/web-reactive.html#webflux-fn )

提示:你可以定義任意多個 RouterFunction bean 來模塊化路由器的定義。如果需要應用優先級,可以對 beans 進行排序。

要開始,請將 spring-boot-starter-webflux 模塊添加到應用程序中。

註釋:在應用程序中同時添加 spring-boot-starter-web 和 spring-boot-starter-webflux 模塊會導致 Spring Boot 自動配置 Spring MVC,而不是 WebFlux。之所以選擇這種行為,是因為許多 Spring 開發者將 spring-boot-starter-webflux 添加到他們的 Spring MVC 應用程序中,以使用反應式 WebClient。你仍然可以通過將所選應用程序類型設置為 SpringApplication.setWebApplicationType(WebApplicationType.REACTIVE) 來強制你的選擇。

29.2.1、Spring WebFlux 自動配置

Spring Boot 為 Spring WebFlux 提供了自動配置,它可以很好地與大多數應用程序一起工作。

自動配置在 Spring 默認設置的基礎上添加了以下特性:

(1)為 HttpMessageReader 和 HttpMessageWriter 實例配置編解碼器(本文檔稍後介紹)。

(2)支持為靜態資源提供服務,包括對 Webjar 的支持(稍後將在本文中描述)。

如果你想保留 Spring Boot WebFlux 的特性,並且想添加額外的 WebFlux 配置,那麼你可以添加自己的類型為 WebFluxConfigurer 類,但是不需要 @EnableWebFlux。

如果您想完全控制 Spring WebFlux,可以添加自己的 @Configuration,並用 @EnableWebFlux 註解。

29.2.2、帶有 HttpMessageReaders 和 HttpMessageWriters 的 HTTP 編解碼器

Spring WebFlux 使用 HttpMessageReader 和 HttpMessageWriter 接口來轉換 HTTP 請求和響應。它們是用 CodecConfigurer 配置的,通過查看類路徑中可用的庫來獲得合理的默認值。

Spring Boot 通過使用 CodecCustomizer 實例應用進一步的定製。例如,spring.jackson.* 配置鍵應用於 Jackson 編解碼器。

如果需要添加或自定義編解碼器,則可以創建自定義 CodecCustomizer 組件,如下面示例所示:

SpringBoot中文參考指南(2.1.6)29.2 Spring WebFlux 框架

<code>import org.springframework.boot.web.codec.CodecCustomizer;@Configurationpublic class MyConfiguration {    @Bean    public CodecCustomizer myCodecCustomizer() {        return codecConfigurer -> {            // ...        }    }}/<code>

你還可以利用 Boot 的自定義 JSON 序列化器和反序列化器。(https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-developing-web-applications.html#boot-features-json-components )

29.2.3、靜態內容

默認情況下,Spring Boot 從類路徑中名為 /static(或 /public 或 /resources 或 /META-INF/resources)的目錄提供靜態內容。它使用 Spring WebFlux 中的 ResourceWebHandler,這樣你就可以通過添加自己的 WebFluxConfigurer 並重寫 addResourceHandlers 方法來修改該行為。

默認情況下,資源被映射到 /**,但是你可以通過設置 spring.webflux.static-path-pattern 屬性來優化它。例如,可以將所有資源重新定位到 /resources/** 中,如下所示:

<code>spring.webflux.static-path-pattern=/resources/**/<code>

還可以使用 spring.resources.static-locations 自定義靜態資源位置。這樣做會將默認值替換為目錄位置列表。如果這樣做,默認的歡迎頁面檢測將切換到你的自定義位置。因此,如果在啟動時在你的任何位置有 index.html,它就是應用程序的主頁。

除了前面的列出的“標準”靜態資源位置之外,Webjars 內容還有一個特殊情況。如果以 Webjars 格式打包,那麼路徑為 /webjars/** 的任何資源都將從 jar 文件中獲得。

提示:Spring WebFlux 應用程序並不嚴格依賴於 Servlet API,因此它們不能作為 war 文件部署,也不能使用 src/main/webapp 目錄。

29.2.4、模板引擎

除了 REST web 服務,你還可以使用 Spring WebFlux 來提供動態 HTML 內容。Spring WebFlux 支持多種模板技術,包括 Thymeleaf、FreeMarker 和 Mustache。

Spring Boot 包括對以下模板引擎的自動配置支持:

(1)FreeMarker(https://freemarker.apache.org/docs/ )

(2)Thymeleaf(https://www.thymeleaf.org/ )

(3)Mustache(https://mustache.github.io/ )

當你使用這些具有默認配置的模板引擎之一時,你的模板將自動從 src/main/resources/templates 中獲取。

29.2.5、錯誤處理

Spring Boot 提供了一個 WebExceptionHandler,它以合理的方式處理所有錯誤。它在處理順序中的位置緊接在 WebFlux 提供的處理器之前,後者被認為是最後一個處理器。對於機器客戶端,它生成一個 JSON 響應,其中包含錯誤、HTTP 狀態和異常消息的詳細信息。對於瀏覽器客戶端,有一個“whitelabel”錯誤處理器以 HTML 格式呈現相同的數據。你還可以提供自己的 HTML 模板來顯示錯誤(請參閱下一節)。

定製此功能的第一步通常涉及使用現有的機制,但替換或擴充錯誤內容。為此,可以添加 ErrorAttributes 類型的 bean。

要更改錯誤處理行為,可以實現 ErrorWebExceptionHandler 並註冊該類型的 bean 定義。由於 WebExceptionHandler 是非常低級的,Spring Boot 還提供了一個方便的 AbstractErrorWebExceptionHandler,使你能夠以 WebFlux 函數的方式處理錯誤,如下面示例所示:

SpringBoot中文參考指南(2.1.6)29.2 Spring WebFlux 框架

<code>public class CustomErrorWebExceptionHandler extends AbstractErrorWebExceptionHandler {    // Define constructor here    @Override    protected RouterFunction<serverresponse> getRoutingFunction(ErrorAttributes errorAttributes) {        return RouterFunctions                .route(aPredicate, aHandler)                .andRoute(anotherPredicate, anotherHandler);    }}/<serverresponse>/<code>

為了獲得更完整的圖景,還可以直接將 DefaultErrorWebExceptionHandler 子類化並重寫特定的方法。

自定義錯誤頁

如果要顯示給定狀態碼的自定義 HTML 錯誤頁,則可以將文件添加到 /error 文件夾。錯誤頁可以是靜態 HTML(即添加到任何靜態資源文件夾下)或使用模板生成。文件名應為確切的狀態碼或序列掩碼。

例如,要將 404 映射到靜態 HTML 文件,文件夾結構如下:

SpringBoot中文參考指南(2.1.6)29.2 Spring WebFlux 框架

<code>src/ +- main/     +- java/     |   + <source>     +- resources/         +- public/             +- error/             |   +- 404.html             +- <other>/<source>/<code>

要使用 Mustache 模板映射所有 5xx 錯誤,文件夾結構如下:

SpringBoot中文參考指南(2.1.6)29.2 Spring WebFlux 框架

<code>src/ +- main/     +- java/     |   + <source>     +- resources/         +- templates/             +- error/             |   +- 5xx.mustache             +- <other>/<source>/<code>

29.2.6、Web 過濾器

Spring WebFlux 提供了一個 WebFilter 接口,可以實現該接口來過濾 HTTP 請求-響應交換。在應用程序上下文中找到的 WebFilter bean 將自動用於過濾每個 exchange。

如果過濾器的順序很重要,那麼它們可以實現 Ordered 接口或用 @Order 註解。Spring Boot 自動配置可以為你配置 web 過濾器。執行此操作時,將使用下表中顯示的順序:

SpringBoot中文參考指南(2.1.6)29.2 Spring WebFlux 框架

<code>Web FilterOrderMetricsWebFilterOrdered.HIGHEST_PRECEDENCE + 1WebFilterChainProxy(Spring Security)-100HttpTraceWebFilterOrdered.LOWEST_PRECEDENCE - 10/<code>

下一篇[未完待續]


分享到:


相關文章: