Spring Boot 參考文檔閱讀摘錄/Spring WebFlux(三)

      網(wǎng)友投稿 1306 2025-04-01

      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?getUser(@PathVariable?Long?user)?{ //?... } @GetMapping("/{user}/customers") public?Flux?getUserCustomers(@PathVariable?Long?user)?{ //?... } @DeleteMapping("/{user}") public?Mono?deleteUser(@PathVariable?Long?user)?{ //?... } }

      “WebFlux.fn”是功能變體,它將路由配置與請(qǐng)求的實(shí)際處理分開,如以下示例所示:

      @Configuration public?class?RoutingConfiguration?{ @Bean public?RouterFunction?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); } } @Component public?class?UserHandler?{ public?Mono?getUser(ServerRequest?request)?{ //?... } public?Mono?getUserCustomers(ServerRequest?request)?{ //?... } public?Mono?deleteUser(ServerRequest?request)?{ //?... } }

      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?getRoutingFunction(ErrorAttributes?errorAttributes)?{ return?RouterFunctions .route(aPredicate,?aHandler) .andRoute(anotherPredicate,?anotherHandler); } }

      Spring Boot 參考文檔閱讀摘錄/Spring WebFlux(三)

      要獲得更完整的圖片,您還可以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)容。

      上一篇:智能制造在中國工業(yè)企業(yè)中的部署及特點(diǎn)
      下一篇:Linux 磁盤文件系統(tǒng)管理
      相關(guān)文章
      亚洲午夜未满十八勿入网站2| 国产精品亚洲一区二区三区在线观看 | 亚洲av日韩av欧v在线天堂| 亚洲人成777在线播放| 亚洲大香人伊一本线| 亚洲国产成人久久77| 亚洲18在线天美| 亚洲午夜一区二区三区| 亚洲午夜一区二区三区| 久久国产亚洲精品| 国产99在线|亚洲| 中文字幕乱码亚洲精品一区| 亚洲国产乱码最新视频 | 亚洲中文字幕丝袜制服一区| 亚洲国产高清在线一区二区三区 | 18禁亚洲深夜福利人口| 午夜亚洲国产理论片二级港台二级| 亚洲欧美日韩中文高清www777| 亚洲av无码一区二区三区四区| 亚洲av永久中文无码精品综合| 久久精品熟女亚洲av麻豆| 亚洲成AV人影片在线观看| 国产成人精品亚洲一区| 亚洲国产激情一区二区三区| 中文字幕无码精品亚洲资源网| 亚洲日本一区二区三区在线| 亚洲av无码国产精品色午夜字幕 | 亚洲国产aⅴ成人精品无吗| 久久综合亚洲色hezyo| 国产99久久亚洲综合精品| 久久精品亚洲乱码伦伦中文| 国产AⅤ无码专区亚洲AV| 亚洲AV无码日韩AV无码导航| 久久精品亚洲精品国产色婷| 亚洲国产成人资源在线软件| 亚洲日产乱码一二三区别| gogo全球高清大胆亚洲| 亚洲无人区一区二区三区| 亚洲国产成人私人影院| 亚洲一区二区三区久久| 亚洲国产精品成人午夜在线观看|