精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

SpringMVC函數式接口Router Function,你用過嗎?

開發 前端
Spring Web MVC包括WebMvc.fn,這是一種輕量級函數式編程模型,其中函數用于路由和處理請求,參數及返回值設計為不可變。

[[437513]]

概述

Spring Web MVC包括WebMvc.fn,這是一種輕量級函數式編程模型,其中函數用于路由和處理請求,參數及返回值設計為不可變。它是基于注釋的編程模型的替代方案,但在其他方面還是運行在同一DispatcherServlet上。

在WebMvc.fn中,HTTP請求由HandlerFunction處理:該函數接受ServerRequest并返回ServerResponse。請求和響應對象都有不可變,提供對HTTP請求和響應的JDK 8友好訪問。HandlerFunction相當于基于注釋的編程模型中@RequestMapping方法的主體。

傳入的請求通過RouterFunction路由到處理程序函數:一個接受ServerRequest并返回可選HandlerFunction(即可選的)的函數。當路由器函數匹配時,返回處理函數;否則為空可選。RouterFunction相當于@RequestMapping注釋,但主要區別在于路由器函數不僅提供數據,還提供行為。

示例:

  1. @Configuration 
  2. public class PersonHandlerConfiguration { 
  3.      
  4.   @Bean 
  5.   public RouterFunction<ServerResponse> person() { 
  6.     return route().GET("/person", accept(MediaType.APPLICATION_JSON), request -> { 
  7.       return ServerResponse.status(HttpStatus.OK).body("Hello World") ; 
  8.     }).build() ; 
  9.   } 
  10.      

我們需要在一個@Configuration配置類中將RouterFunction暴露為Bean對象即可。

GET方法的3個參數:

第一個:請求的接口地址。

第二個:謂詞也就是限定哪些調用能夠匹配上,這個類似注解接口@RequestMapping參數中的consumer,params等屬性一樣。

第三個:HandlerFunction,這就是處理器對象了,實際的業務方法的處理對比@RequestMapping的方法體了。

HandlerFunction對象

ServerRequest和ServerResponse是不可變的接口,提供對HTTP請求和響應的JDK8友好訪問,包括頭、正文、方法和狀態代碼。

  • ServerRequest

ServerRequest提供對HTTP方法、URI、頭和查詢參數的訪問,而對主體的訪問是通過主體方法提供的。如下示例:

  1. @Bean 
  2. public RouterFunction<ServerResponse> student() { 
  3.   return route().GET("/student/{id}", accept(MediaType.APPLICATION_JSON), request -> { 
  4.     return ServerResponse.ok().body("name = " + request.param("name").get() + ", id = " + request.pathVariable("id")) ; 
  5.   }) 
  6.   .POST("/student", accept(MediaType.APPLICATION_JSON), request -> { 
  7.     return ServerResponse.ok().body(request.body(Student.class)) ; 
  8.   }) 
  9.   .build() ; 

GET接口獲取查詢參數和路徑上的參數。

POST接口獲取body主體內容。

  • ServerResponse

ServerResponse提供對HTTP響應的訪問,因為它是不可變的,所以可以使用構建方法來創建它。可以使用生成器設置響應狀態、添加響應標題或提供正文。

在上面的示例中已經看到了如何使用,這里就不再給出示例了。

  • Handler Classes處理器類

將處理器類單獨定義到一個文件中進行相應的處理,這就與傳統的@RestController注解類似了將很多的接口方法都定義在一個Controller類中。

示例:

  1. @Configuration 
  2. public class PersonHandlerConfiguration { 
  3.      
  4.   @Resource 
  5.   private PersonHandler ph ; 
  6.    
  7.   @Bean 
  8.   public RouterFunction<ServerResponse> person() { 
  9.   return route() 
  10.       .GET("/person/{id}", accept(MediaType.APPLICATION_JSON), ph::queryPerson) 
  11.       .POST("/person", accept(MediaType.APPLICATION_JSON), ph::save) 
  12.       .build() ; 
  13.   } 

 處理器類(在該類中可以注入DAO類進行相關的數據庫操作) 

  1. @Component 
  2. public class PersonHandler { 
  3.      
  4.   public ServerResponse save(ServerRequest request) throws Exception { 
  5.     return ok().body(request.body(Person.class)) ; 
  6.   } 
  7.      
  8.   public ServerResponse queryPerson(ServerRequest request) throws Exception { 
  9.     return ok().body(new Person(Integer.valueOf(request.pathVariable("id")), "中國")) ; 
  10.   } 
  11.      
  • Validation驗證

可以使用Spring的驗證工具將驗證應用于請求主體。例如,給定一個人的自定義Spring驗證器實現。示例:

  1. @Component 
  2. public class PersonHandler { 
  3.      
  4.   @Resource 
  5.   private Validator validator ; 
  6.      
  7.   public ServerResponse save(ServerRequest request) throws Exception { 
  8.     Person person = request.body(Person.class) ; 
  9.     Errors errors = validate(person) ; 
  10.     if (errors == null) { 
  11.       return ok().body(person) ; 
  12.     } 
  13.     return ok().body(errors.toString()) ; 
  14.   } 
  15.  
  16.   private Errors validate(Person person) { 
  17.     Errors errors = new BeanPropertyBindingResult(person, "person"); 
  18.     validator.validate(person, errors); 
  19.     if (errors.hasErrors()) { 
  20.       return errors ;  
  21.     } 
  22.     return null ; 
  23.   } 
  24.      

需要引入依賴:

  1. <dependency> 
  2.   <groupId>org.springframework.boot</groupId> 
  3.   <artifactId>spring-boot-starter-validation</artifactId> 
  4. </dependency>

關于參數驗證《Springboot項目中你的參數都在如何驗證?這個starter你知道嗎?》

RouterFunction

路由器功能用于將請求路由到相應的HandlerFunction。通常,你不會自己編寫路由器函數,而是使用RouterFunctions類上的方法來創建路由器函數。RouterFunctions.route()(無參數)為你提供了創建路由器函數的流暢生成器,而RouterFunctions.route(RequestPredicate,HandlerFunction)則提供了創建路由器的直接方法。

通常,建議使用route() 構建,因為它為典型映射場景提供了方便的捷徑,而不需要難以發現的靜態導入。例如,router function builder提供方法GET(String,HandlerFunction)為GET請求創建映射;和POST(字符串、HandlerFunction)用于POST。

除了基于HTTP方法的映射之外,route builder還提供了一種在映射到請求時引入額外謂詞的方法。對于每個HTTP方法,都有一個重載變量,該變量將RequestPredicate作為參數,通過它可以表示額外的約束。

在上面的示例中已經看到了在做相應GET,POST方法時傳的第二個參數。

  • 謂詞Predicate

我們可以編寫自己的RequestPredicate,但是RequestPredicates類提供了基于請求路徑、HTTP方法、內容類型等的常用實現。如下示例通過Accept來限定了能夠接收的數據類型。

  1. import static org.springframework.web.servlet.function.RequestPredicates.accept; 
  2. @Bean 
  3. public RouterFunction<ServerResponse> hello() { 
  4.   return route().GET("/hello", accept(MediaType.APPLICATION_JSON), request -> { 
  5.     return ServerResponse.status(HttpStatus.OK).body("Hello World") ; 
  6.   }).build() ; 

 還可以通過and 或者 or 來添加多個謂詞

accept(...).and() || or()

  • 嵌套路由

在傳統的Controller定義時,可以在類上加@RequestMapping("/person")注解的方式來統一請求接口的前綴。在函數式接口中我們可以通過如下的方式設定:

  1. @Bean 
  2. public RouterFunction<ServerResponse> nestPerson() { 
  3.   return route() 
  4.               .path("/persons", builder -> builder  
  5.               .GET("/{id}", accept(MediaType.APPLICATION_JSON), ph::queryPerson) 
  6.               .POST("/save", ph::save)) 
  7.                   .build(); 

 通過path定義了路由的前綴。也可以通過如下方式:

  1. @Bean 
  2. public RouterFunction<ServerResponse> nestPerson2() { 
  3.   return route() 
  4.       .path("/persons2", b1 -> b1 
  5.         .nest(accept(MediaType.APPLICATION_JSON), b2 -> b2 
  6.           .GET("/{id}", accept(MediaType.APPLICATION_JSON), ph::queryPerson)) 
  7.         .POST("/save", ph::save)) 
  8.       .build(); 

HandlerMapping

這種函數式接口既然底層還是使用的DispatcherServlet ,那么它就會有對應的HandlerMapping和Adapter

RouterFunctionMapping:檢測Spring配置中的一個或多個RouterFunctionbean,對它們進行排序,通過RouterFunction.andOther組合它們,并將請求路由到生成的組合RouterFunction。

HandlerFunctionAdapter:讓DispatcherHandler調用映射到請求的HandlerFunction的簡單適配器。

過濾器

可以使用路由函數生成器上的before、after或filter方法篩選處理程序函數。對于接口注釋的方式,我們可以通過使用@ControllerAdvice、ServletFilter或兩者來實現類似的功能。過濾器將應用于生成器生成的所有路由。這意味著嵌套路由中定義的過濾器不適用于“頂層”路由。示例:

  1. @Bean 
  2. public RouterFunction<ServerResponse> nestPerson2() { 
  3.   return route() 
  4.         .path("/persons2", b1 -> b1 
  5.           .nest(accept(MediaType.APPLICATION_JSON), b2 -> b2 
  6.             .GET("/{id}", accept(MediaType.APPLICATION_JSON), ph::queryPerson) 
  7.             .before(request -> ServerRequest.from(request).header("x-pack""123123").build())) 
  8.           .POST("/save", ph::save)) 
  9.           .after((request, response) -> { 
  10.             System.out.println("after execution..." + response.statusCode()); 
  11.             return response ; 
  12.           }) 
  13.          .filter((request, next) -> { 
  14.            if (request.pathVariable("id").equals("100")) { 
  15.              return ServerResponse.ok().body("參數錯誤") ; 
  16.            } else { 
  17.             return next.handle(request) ; 
  18.            } 
  19.          }) 
  20.         .build(); 
  21. public ServerResponse queryPerson(ServerRequest request) throws Exception { 
  22.   System.out.println(request.headers().header("x-pack")) ; 
  23.   return ok().body(new Person(Integer.valueOf(request.pathVariable("id")), "中國")) ; 

before:添加了自定義header信息,然后我們可以在queryPerson中獲取到,并且該before只能應用于當前這個嵌套的路由中。

after:能夠應用所有的路由中

filter:filter方法采用HandlerFilterFunction:采用ServerRequest和HandlerFunction并返回ServerResponse的函數。handler函數參數表示鏈中的下一個元素。這通常是路由到的處理程序,但如果應用了多個過濾器,它也可以是另一個過濾器。

Swagger

此時的Swagger沒有用了,所以你要慎用啊。

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2023-09-09 12:23:24

函數式接口程序

2023-01-28 09:38:48

接口SpringMVC

2024-01-09 08:20:05

2023-12-22 16:39:47

Java函數式接口開發

2020-08-16 10:58:20

Pandaspython開發

2024-10-30 16:39:45

2017-10-26 08:53:38

前端JavaScript函數式編程

2020-12-31 05:49:44

FlinkSQL函數

2024-03-11 08:21:49

2012-02-06 13:52:33

JavaScript

2021-11-11 08:20:47

Vue 技巧 開發工具

2022-05-18 08:00:26

函數劫持JavaScript鉤子函數

2023-09-12 08:19:48

接口Controller線程

2022-05-05 07:25:03

Supervisor監控Python

2024-03-21 10:39:24

CIOAI

2021-05-07 13:39:20

Python工具代碼

2025-04-03 08:00:00

灰度發布Java開發

2020-01-17 20:00:25

SQL函數數據庫

2021-05-21 13:36:46

iOSiPhone功能

2020-09-21 14:55:15

數據庫SQL技術
點贊
收藏

51CTO技術棧公眾號

成人美女在线视频| 欧美色图麻豆| 欧美男同性恋视频网站| 国产欧美自拍视频| 日韩一级片免费在线观看| 久久婷婷丁香| 久久在精品线影院精品国产| 中文字幕天堂av| 在线日本欧美| 亚洲国产你懂的| 涩涩涩999| 国产小视频一区| 麻豆视频观看网址久久| 欧美性猛交xxxx乱大交3| 日本一区二区三区免费观看 | 在线亚洲自拍| 久久久国产精品免费| 免费看黄色aaaaaa 片| 青青青国产精品| 日韩欧美精品网址| 欧美亚洲色图视频| 麻豆视频在线观看免费网站| av激情亚洲男人天堂| 91精品久久久久| 久久久精品视频网站 | 欧美v在线观看| 在线观看免费视频你懂的| 国产午夜精品久久| 精品一区二区不卡| 亚洲国产精品一| 精品一区二区三区不卡| 国产精品电影一区| 欧美亚洲精品天堂| 在线看片一区| 欧美激情在线观看| 欧美丰满熟妇bbbbbb| 日韩欧美一区二区三区在线视频| 亚洲欧美国产日韩天堂区| 熟妇高潮一区二区| 这里视频有精品| 日韩亚洲欧美高清| 91视频福利网| 国产视频一区二| 欧美年轻男男videosbes| 中文字幕国内自拍| 日本肉肉一区| 欧洲中文字幕精品| 嫩草av久久伊人妇女超级a| 中文不卡1区2区3区| 亚洲成人激情综合网| 91免费版看片| 欧美人动性xxxxz0oz| 亚洲品质自拍视频网站| 强伦女教师2:伦理在线观看| av网在线观看| 亚洲欧美在线aaa| 在线观看免费黄色片| 国产成人午夜| 一区二区三区不卡视频在线观看| www.69av| 僵尸再翻生在线观看| 懂色av中文一区二区三区天美| 农民人伦一区二区三区| 国产777精品精品热热热一区二区| 亚洲国产美国国产综合一区二区| 国产精品专区在线| 最新日韩精品| 欧美色图第一页| 色男人天堂av| 极品国产人妖chinesets亚洲人妖| 亚洲成人中文字幕| 中文字幕第20页| 成人av动漫在线观看| 日韩在线视频免费观看高清中文| 五月天婷婷色综合| 亚洲国产高清一区二区三区| 2019亚洲男人天堂| 自拍偷拍第八页| 国内成人精品2018免费看| 99久久精品免费看国产四区| 午夜国产在线视频| 国产精品美女久久久久久2018 | 公侵犯人妻一区二区三区| 国产一卡不卡| 理论片在线不卡免费观看| 国产五月天婷婷| 日韩激情中文字幕| av一区和二区| 国产在线小视频| 亚洲毛片av在线| 亚洲 中文字幕 日韩 无码| а天堂中文最新一区二区三区| 精品久久久网站| 国产精品密蕾丝袜| 午夜激情一区| 国产成人精品久久二区二区| 国产浮力第一页| 久久久久久久久岛国免费| 中文网丁香综合网| 小h片在线观看| 欧美一区二区视频在线观看 | 第一社区sis001原创亚洲| 欧美另类在线播放| 伊人久久久久久久久久久久 | gratisvideos另类灌满| 欧美在线视频日韩| 五月天丁香社区| 色97色成人| 欧美在线免费视频| 亚洲成人中文字幕在线| 亚洲国产精品高清| 欧美乱大交xxxxx潮喷l头像| 2020国产精品小视频| 亚洲欧洲中文天堂| 久久这里只有精品国产| 精品夜夜嗨av一区二区三区| 秋霞久久久久久一区二区| 国产啊啊啊视频在线观看| 欧美日韩一本到| 国产毛片久久久久久久| 亚洲国产高清一区二区三区| 91成人免费观看| 日韩理伦片在线| 欧美影视一区在线| 能免费看av的网站| 99精品国产一区二区青青牛奶 | 日本高清中文字幕二区在线| 亚洲精品国产视频| 久热精品在线播放| 精品国产一区二区三区久久久樱花| 午夜精品一区二区三区在线播放 | 日韩电影第一页| 国产亚洲精久久久久久无码77777| 久久99精品久久久| 亚洲国产高清国产精品| 欧美一级大片| 亚洲人成电影网| 亚洲天堂视频网站| 99这里都是精品| www..com日韩| 国产精品18hdxxxⅹ在线| 欧美国产第二页| 性中国xxx极品hd| 亚洲国产另类精品专区| 高清中文字幕mv的电影| 精品av久久久久电影| 国产精品久久波多野结衣| 人妖欧美1区| 精品国产一区二区三区av性色 | 日本韩国一区二区三区| 3d动漫精品啪啪一区二区下载 | 师生出轨h灌满了1v1| 欧美1区2区3区| 99久久国产免费免费| 女子免费在线观看视频www| 精品久久久久一区二区国产| 久久精品亚洲无码| 99国产欧美另类久久久精品 | 欧美卡一卡二卡三| 国产麻豆精品95视频| 日韩欧美一级在线| 一区二区三区视频播放| 午夜免费在线观看精品视频| 美女欧美视频在线观看免费 | 日本xxxx黄色| 在线观看日韩| 国产精品一区二区三区精品| 蜜桃av在线| 国产亚洲精品激情久久| 一卡二卡在线视频| 亚洲综合丝袜美腿| 熟女人妻在线视频| 日本va欧美va瓶| 欧美少妇一区二区三区| 岛国av一区| 国产精品jizz在线观看麻豆| 二区三区在线观看| 亚洲福利视频网站| 久久国产乱子伦精品| 亚洲色欲色欲www在线观看| 精品国产免费久久久久久婷婷| 香蕉久久国产| 这里只有精品66| 久久精品66| 国产精品一区二区三区久久久 | 三级无遮挡在线观看| 欧美色综合网站| 精品爆乳一区二区三区无码av| 99精品视频一区二区| 天天爽夜夜爽一区二区三区| 欧美午夜影院| 日韩在线电影一区| 北条麻妃在线一区二区免费播放| 国产精品91免费在线| 日本高清成人vr专区| 亚洲欧美制服中文字幕| 国产黄色一级大片| 欧美综合久久久| 日本熟妇毛耸耸xxxxxx| 国产精品美女一区二区在线观看| 久久久老熟女一区二区三区91| 麻豆成人91精品二区三区| 亚洲美免无码中文字幕在线| 久久人体视频| 欧美激情视频一区二区三区| 视频一区视频二区欧美| 国产欧美日韩亚洲精品| 涩涩av在线| 欧美激情三级免费| 黄网站在线播放| 国产午夜精品免费一区二区三区| 成人久久久精品国产乱码一区二区 | a级精品国产片在线观看| 亚洲免费黄色录像| 久久久久国产精品午夜一区| h无码动漫在线观看| 99久久这里只有精品| 久久综合久久久| 成人在线超碰| 亚洲自拍欧美另类| 国产福利亚洲| 国产精品久久久久福利| 桃色av一区二区| 韩国美女主播一区| 亚洲男同gay网站| x99av成人免费| sese在线视频| 亚洲性猛交xxxxwww| 色av男人的天堂免费在线| 亚洲成人精品视频在线观看| 国产不卡av在线播放| 欧美久久久久久久久中文字幕| japanese国产在线观看| 日韩欧美成人精品| 久久黄色精品视频| 精品国产老师黑色丝袜高跟鞋| 久久久久成人片免费观看蜜芽| 亚洲女性喷水在线观看一区| 九九这里只有精品视频| **性色生活片久久毛片| 中文字幕乱码av| 亚洲欧美偷拍卡通变态| 精品国产视频在线观看| 亚洲少妇30p| 99视频只有精品| 亚洲一区中文在线| 久久免费播放视频| 午夜视频在线观看一区| 国产精品亚洲自拍| 国产一级做a爱免费视频| 亚洲男人电影天堂| 精品欧美一区二区久久久久| 一区二区三区四区蜜桃| 国产一级二级三级| 亚洲一区av在线| 国产成人无码一区二区三区在线| 欧美日韩国产激情| 毛片基地在线观看| 黑丝一区二区| 亚洲91av视频| 久久电影网站| 91国产一区在线| 蜜臀国产一区| 国产欧美一区二区三区久久人妖| 国产精品亚洲四区在线观看| 成人动漫在线观看视频| 牛牛视频精品一区二区不卡| 久久综合中文色婷婷| 欧美精品尤物在线观看| 一区二区三区三区在线| 欧美日韩mv| 国产a级一级片| 久久爱另类一区二区小说| 色诱av手机版| 久久免费的精品国产v∧| 毛片视频免费播放| 亚洲综合久久久| 国产视频1区2区| 91精品国产综合久久久久久| 四虎精品一区二区三区| 亚洲男人天堂2019| 久久bbxx| 国产91精品视频在线观看| 欧美激情三区| 国产精品久久久久久久久久久久冷 | 视频一区在线播放| 九九九九九九九九| av亚洲产国偷v产偷v自拍| 五月婷婷婷婷婷| 亚洲一区二区成人在线观看| 无码人妻黑人中文字幕| 日韩欧美激情在线| 都市激情一区| 97碰在线观看| 国产专区精品| 热re99久久精品国产99热| 午夜欧美精品| 欧美三级理论片| 99久久婷婷国产精品综合| 国产一区在线观看免费| 欧美日韩亚洲视频| 国产黄色小视频在线观看| 国产一区二区三区视频免费| av手机免费在线观看| 成人xxxx视频| 视频一区在线观看| 激情五月婷婷六月| 极品少妇一区二区三区精品视频| 中文字幕在线观看网址| 一区二区三区在线看| 中文字幕在线2019| 亚洲精品中文字幕女同| 性欧美1819sex性高清大胸| 国产精品久久久久久久久影视| 久久综合五月婷婷| 中文字幕色呦呦| 久久精品国产精品青草| 91精品人妻一区二区| 性久久久久久久久| 成人av一区二区三区在线观看| 日韩天堂在线视频| 在线观看精品| 看高清中日韩色视频| 亚洲精品极品| 亚洲最大视频网| 亚洲精品国产精华液| 国产欧美综合视频| 久久精品视频在线播放| 欧美激情不卡| 亚洲一区三区视频在线观看| 日本一区中文字幕| 久久国产精品影院| 都市激情亚洲色图| 性xxxfllreexxx少妇| 69久久夜色精品国产69乱青草| h视频久久久| 轻点好疼好大好爽视频| 国产成人免费视频精品含羞草妖精| 日韩一卡二卡在线观看| 欧美绝品在线观看成人午夜影视| 在线观看免费网站黄| 国产精品美女999| 日韩久久精品网| 欧美三级理论片| ㊣最新国产の精品bt伙计久久| 国产亲伦免费视频播放| 欧美精品在线极品| 永久免费精品视频| 国产自产在线视频| 91亚洲精品乱码久久久久久蜜桃| 天天操天天操天天操天天| 亚洲男人天堂网| 中文另类视频| 亚洲人一区二区| 国产一区二区91| 久久精品国产亚洲av无码娇色 | 1024手机在线观看你懂的| 欧美亚洲高清一区| 一区二区三区视频网站 | 亚洲人成无码www久久久| 国产亚洲精品超碰| 亚洲资源在线播放| 欧美噜噜久久久xxx| 老司机精品视频在线播放| 精品中文字幕av| 中文字幕免费在线观看视频一区| 一级特黄录像免费看| 欧美精品福利在线| 亚洲精品一级二级三级| 自拍偷拍21p| 亚洲美女视频在线观看| 天天爽夜夜爽夜夜爽| 国产精品高潮呻吟久久av黑人| 93在线视频精品免费观看| 国产又粗又猛又爽又黄| 欧美午夜精品伦理| 婷婷成人激情| 国产精品一区二区免费| 日本强好片久久久久久aaa| 中文字幕电影av| 日韩国产高清视频在线| 欧美天堂一区| 人妻久久久一区二区三区| 欧美激情一区二区三区不卡| 精品国产av鲁一鲁一区| 欧美在线视频免费播放| 91成人观看| 亚洲熟妇无码av| 日韩欧美成人一区| 欧洲精品一区二区三区| 国产又粗又猛又爽又黄的网站| 久久你懂得1024| www.国产精品视频| 国产精品极品美女粉嫩高清在线| 亚洲精品成人无限看| 一区二区三区四区免费| 日韩美女视频在线| 国产极品嫩模在线观看91精品| 欧美黑人经典片免费观看| 日韩美女视频一区|