Spring Boot 參考文檔閱讀摘錄/Spring WebFlux(三)
28.2“spring WebFlux框架”

spring WebFlux是Spring Framework 5.0中引入的新的反應(yīng)式Web框架。與Spring MVC不同,它不需要Servlet API,完全異步且無阻塞,并 通過Reactor項(xiàng)目實(shí)現(xiàn)Reactive Streams規(guī)范。
Spring WebFlux有兩種版本:基于功能和注釋。基于注釋的注釋非常接近Spring MVC模型,如以下示例所示:
@RestController @RequestMapping("/users") public?class?MyRestController?{ @GetMapping("/{user}") public?Mono
“WebFlux.fn”是功能變體,它將路由配置與請(qǐng)求的實(shí)際處理分開,如以下示例所示:
@Configuration public?class?RoutingConfiguration?{ @Bean public?RouterFunction
WebFlux是Spring Framework的一部分,詳細(xì)信息可在其 參考文檔中找到。
[注]
您可以根據(jù)需要定義任意數(shù)量的RouterFunctionbean來模塊化路由器的定義。如果需要應(yīng)用優(yōu)先級(jí),可以訂購Bean。
要開始,請(qǐng)將spring-boot-starter-webflux模塊添加到您的應(yīng)用程序中。
[注]
在應(yīng)用程序中添加兩個(gè)spring-boot-starter-web和spring-boot-starter-webflux模塊會(huì)導(dǎo)致Spring Boot自動(dòng)配置Spring MVC,而不是WebFlux。選擇此行為是因?yàn)樵S多Spring開發(fā)人員spring-boot-starter-webflux 在其Spring MVC應(yīng)用程序中添加了使用被動(dòng)的WebClient。您仍然可以通過將所選應(yīng)用程序類型設(shè)置為來強(qiáng)制執(zhí)行您的選擇 SpringApplication.setWebApplicationType(WebApplicationType.REACTIVE)。
28.2.1 Spring WebFlux自動(dòng)配置
Spring Boot為Spring WebFlux提供自動(dòng)配置,適用于大多數(shù)應(yīng)用程序。
自動(dòng)配置在Spring的默認(rèn)值之上添加了以下功能:
為for HttpMessageReader和HttpMessageWriter實(shí)例配置編解碼器( 本文檔稍后將介紹)。
支持提供靜態(tài)資源,包括對(duì)WebJars的支持( 本文檔后面將介紹)。
如果你想保留Spring Boot WebFlux功能,并且想要添加額外的 WebFlux配置,你可以添加自己的 @Configuration類類WebFluxConfigurer但不需要 @EnableWebFlux。
如果要完全控制Spring WebFlux,可以添加自己的 @Configuration注釋@EnableWebFlux。
28.2.2帶有HttpMessageReaders和HttpMessageWriters的HTTP編解碼器
Spring WebFlux使用HttpMessageReader和HttpMessageWriter接口來轉(zhuǎn)換HTTP請(qǐng)求和響應(yīng)。CodecConfigurer通過查看類路徑中可用的庫,它們被配置為具有合理的默認(rèn)值。
Spring Boot通過使用CodecCustomizer實(shí)例進(jìn)一步自定義。例如,spring.jackson.*配置密鑰應(yīng)用于Jackson編解碼器。
如果需要添加或自定義編解碼器,可以創(chuàng)建自定義CodecCustomizer 組件,如以下示例所示:
import?org.springframework.boot.web.codec.CodecCustomizer; @Configuration ?public??class?MyConfiguration?{ @Bean ?public?CodecCustomizer?myCodecCustomizer(){ ?return?codecConfigurer??-?>?{ ?//?... } } }
您還可以利用Boot的自定義JSON序列化程序和反序列化程序。
28.2.3靜態(tài)內(nèi)容
默認(rèn)情況下,Spring Boot從類路徑中名為/static( /public或/resources或/META-INF/resources)的目錄中提供靜態(tài)內(nèi)容。它使用 ResourceWebHandlerSpring WebFlux,以便您可以通過添加自己WebFluxConfigurer的addResourceHandlers方法來修改該行為并覆蓋該方法。
默認(rèn)情況下,會(huì)映射資源/**,但您可以通過設(shè)置spring.webflux.static-path-pattern屬性來調(diào)整它 。例如,/resources/**可以按如下方式重新定位所有資源 :
spring.webflux.static-path-pattern = / resources / **
您還可以使用自定義靜態(tài)資源位置 spring.resources.static-locations。這樣做會(huì)將默認(rèn)值替換為目錄位置列表。如果這樣做,默認(rèn)的歡迎頁面檢測(cè)會(huì)切換到您的自定義位置。因此,如果index.html您的任何位置在啟動(dòng)時(shí)存在,則它是應(yīng)用程序的主頁。
除了前面列出的“標(biāo)準(zhǔn)”靜態(tài)資源位置之外,還為Webjars內(nèi)容制作了一個(gè)特例。具有路徑的任何資源 /webjars/**都是從jar文件提供的,如果它們以Webjars格式打包的話。
[注]
Spring WebFlux應(yīng)用程序并不嚴(yán)格依賴于Servlet API,因此它們不能作為war文件部署,也不能使用該src/main/webapp目錄。
28.2.4模板引擎
除REST Web服務(wù)外,您還可以使用Spring WebFlux來提供動(dòng)態(tài)HTML內(nèi)容。Spring WebFlux支持各種模板技術(shù),包括Thymeleaf,F(xiàn)reeMarker和Mustache。
Spring Boot包含對(duì)以下模板引擎的自動(dòng)配置支持:
FreeMarker
Thymeleaf
胡子
當(dāng)您使用其中一個(gè)模板引擎和默認(rèn)配置時(shí),您的模板將自動(dòng)從中獲取src/main/resources/templates。
28.2.5錯(cuò)誤處理
Spring Boot提供了WebExceptionHandler一種以合理的方式處理所有錯(cuò)誤的方法。它在處理順序中的位置緊接在WebFlux提供的處理程序之前,這被認(rèn)為是最后的。對(duì)于計(jì)算機(jī)客戶端,它會(huì)生成一個(gè)JSON響應(yīng),其中包含錯(cuò)誤,HTTP狀態(tài)和異常消息的詳細(xì)信息。對(duì)于瀏覽器客戶端,有一個(gè)“whitelabel”錯(cuò)誤處理程序,它以HTML格式呈現(xiàn)相同的數(shù)據(jù)。您還可以提供自己的HTML模板來顯示錯(cuò)誤(請(qǐng)參閱 下一節(jié))。
自定義此功能的第一步通常涉及使用現(xiàn)有機(jī)制,但替換或擴(kuò)充錯(cuò)誤內(nèi)容。為此,您可以添加類型的bean ErrorAttributes。
要更改錯(cuò)誤處理行為,可以實(shí)現(xiàn)ErrorWebExceptionHandler并注冊(cè)該類型的bean定義。由于a WebExceptionHandler是一個(gè)非常低級(jí)別的,Spring Boot還提供了一個(gè)方便AbstractErrorWebExceptionHandler的讓你以WebFlux功能方式處理錯(cuò)誤,如下例所示:
public?class?CustomErrorWebExceptionHandler?extends?AbstractErrorWebExceptionHandler?{ //?Define?constructor?here @Override protected?RouterFunction
要獲得更完整的圖片,您還可以DefaultErrorWebExceptionHandler 直接子類化并覆蓋特定方法。
自定義錯(cuò)誤頁面
如果要顯示給定狀態(tài)代碼的自定義HTML錯(cuò)誤頁面,可以將文件添加到文件/error夾。錯(cuò)誤頁面可以是靜態(tài)HTML(即,添加到任何靜態(tài)資源文件夾下)或使用模板構(gòu)建。文件名應(yīng)該是確切的狀態(tài)代碼或系列掩碼。
例如,要映射404到靜態(tài)HTML文件,您的文件夾結(jié)構(gòu)如下所示:
src/
+- main/
+- java/
| ? +
+- resources/
+- public/
+- error/
| ? +- 404.html
+-
要5xx使用Mustache模板映射所有錯(cuò)誤,您的文件夾結(jié)構(gòu)如下:
src/
+- main/
+- java/
| ? +
+- resources/
+- templates/
+- error/
| ? +- 5xx.mustache
+-
28.2.6 Web過濾器
Spring WebFlux提供了一個(gè)WebFilter可以實(shí)現(xiàn)過濾HTTP請(qǐng)求 - 響應(yīng)交換的接口。WebFilter在應(yīng)用程序上下文中找到的bean將自動(dòng)用于過濾每個(gè)交換。
如果過濾器的順序很重要,則可以實(shí)現(xiàn)Ordered或注釋@Order。Spring Boot自動(dòng)配置可以為您配置Web過濾器。執(zhí)行此操作時(shí),將使用下表中顯示的訂單:
MetricsWebFilter
Ordered.HIGHEST_PRECEDENCE + 1
WebFilterChainProxy?(Spring Security)
-100
HttpTraceWebFilter
Ordered.LOWEST_PRECEDENCE - 10
MVC Spring Boot Spring
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。