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

Spring MVC函數式接口Router Function你用過嗎?

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

環境:Springboot2.4.12

概述

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

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

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

示例:

@Configuration
public class PersonHandlerConfiguration {
  
  @Bean
  public RouterFunction<ServerResponse> person() {
    return route().GET("/person", accept(MediaType.APPLICATION_JSON), request -> {
      return ServerResponse.status(HttpStatus.OK).body("Hello World") ;
    }).build() ;
  }
  
}

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

GET方法的3個參數:

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

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

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

HandlerFunction對象

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

  • ServerRequest

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

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

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

POST接口獲取body主體內容。

  • ServerResponse

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

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

  • Handler Classes處理器類

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

示例:

@Configuration
public class PersonHandlerConfiguration {
  
  @Resource
  private PersonHandler ph ;
  
  @Bean
  public RouterFunction<ServerResponse> person() {
  return route()
      .GET("/person/{id}", accept(MediaType.APPLICATION_JSON), ph::queryPerson)
      .POST("/person", accept(MediaType.APPLICATION_JSON), ph::save)
      .build() ;
  }
}

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

@Component
public class PersonHandler {
  
  public ServerResponse save(ServerRequest request) throws Exception {
    return ok().body(request.body(Person.class)) ;
  }
  
  public ServerResponse queryPerson(ServerRequest request) throws Exception {
    return ok().body(new Person(Integer.valueOf(request.pathVariable("id")), "中國")) ;
  }
  
}
  • Validation驗證

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

@Component
public class PersonHandler {
  
  @Resource
  private Validator validator ;
  
  public ServerResponse save(ServerRequest request) throws Exception {
    Person person = request.body(Person.class) ;
    Errors errors = validate(person) ;
    if (errors == null) {
      return ok().body(person) ;
    }
    return ok().body(errors.toString()) ;
  }


  private Errors validate(Person person) {
    Errors errors = new BeanPropertyBindingResult(person, "person");
    validator.validate(person, errors);
    if (errors.hasErrors()) {
      return errors ; 
    }
    return null ;
  }
  
}

需要引入依賴:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-validation</artifactId>
</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來限定了能夠接收的數據類型。

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

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

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

  • 嵌套路由

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

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

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

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

HandlerMapping

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

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

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

過濾器

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

@Bean
public RouterFunction<ServerResponse> nestPerson2() {
  return route()
        .path("/persons2", b1 -> b1
          .nest(accept(MediaType.APPLICATION_JSON), b2 -> b2
            .GET("/{id}", accept(MediaType.APPLICATION_JSON), ph::queryPerson)
            .before(request -> ServerRequest.from(request).header("x-pack", "123123").build()))
          .POST("/save", ph::save))
          .after((request, response) -> {
            System.out.println("after execution..." + response.statusCode());
            return response ;
          })
         .filter((request, next) -> {
           if (request.pathVariable("id").equals("100")) {
             return ServerResponse.ok().body("參數錯誤") ;
           } else {
            return next.handle(request) ;
           }
         })
        .build();
}
public ServerResponse queryPerson(ServerRequest request) throws Exception {
  System.out.println(request.headers().header("x-pack")) ;
  return ok().body(new Person(Integer.valueOf(request.pathVariable("id")), "中國")) ;
}

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

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

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

Swagger

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

完畢!!!

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2021-11-30 08:44:29

SpringRouter Func函數式接口

2024-01-09 08:20:05

2023-01-28 09:38:48

接口SpringMVC

2023-12-22 16:39:47

Java函數式接口開發

2023-09-12 08:19:48

接口Controller線程

2025-04-22 00:00:00

2020-08-16 10:58:20

Pandaspython開發

2017-10-26 08:53:38

前端JavaScript函數式編程

2025-01-07 09:16:16

2020-12-31 05:49:44

FlinkSQL函數

2025-05-12 04:00:00

2023-09-15 08:18:49

cookie網關代理

2012-02-06 13:52:33

JavaScript

2024-03-11 08:21:49

2021-11-11 08:20:47

Vue 技巧 開發工具

2022-05-18 08:00:26

函數劫持JavaScript鉤子函數

2024-03-21 10:39:24

CIOAI

2021-05-07 13:39:20

Python工具代碼

2022-05-05 07:25:03

Supervisor監控Python

2025-04-03 08:00:00

灰度發布Java開發
點贊
收藏

51CTO技術棧公眾號

亚洲精品成人| 亚洲精品成a人ⅴ香蕉片| 成人aaaa免费全部观看| 欧美亚洲成人精品| 精品人妻一区二区三区四区| 日韩福利影视| 亚洲国产日韩av| 欧美成熟毛茸茸复古| 一级片在线免费观看视频| 精品成人一区| 最近免费中文字幕视频2019| 国产成人av片| 78精品国产综合久久香蕉| 亚洲精品中文在线观看| 久久久久网址| a天堂中文在线观看| 水野朝阳av一区二区三区| 久久中文字幕在线| 久久久精品人妻无码专区| 亚洲影视资源| 色诱视频网站一区| 波多野结衣 作品| av影片在线看| 91丝袜美腿高跟国产极品老师 | 中日韩一级黄色片| 天堂成人娱乐在线视频免费播放网站 | 日韩av在线网站| 欧美视频亚洲图片| 麻豆精品蜜桃| 欧美性极品少妇精品网站| 国产精品免费看久久久无码| 午夜看片在线免费| 久久久不卡网国产精品一区| 成人免费视频网站| 国产精品亚洲lv粉色| 日韩专区中文字幕一区二区| 91精品国产高清| 免费在线一区二区三区| 911精品美国片911久久久| 亚洲视频电影图片偷拍一区| 99久久免费看精品国产一区| 久久久久毛片免费观看| 欧美色视频在线观看| 黄色一级二级三级| 国产精品迅雷| 色综合久久99| 国产一区二区三区精彩视频 | 一区二区三区在线观看欧美 | 午夜精彩国产免费不卡不顿大片| 在线视频日韩精品| 亚洲成人黄色av| 亚洲另类av| 亚洲欧美国产视频| 女人又爽又黄免费女仆| 中文字幕av一区二区三区人| 日韩精品免费综合视频在线播放| 伊人久久一区二区三区| 国产精品久久久久av蜜臀| 欧美一级片免费看| 精品人妻一区二区乱码| 色播一区二区| 精品va天堂亚洲国产| 香蕉视频免费网站| 高潮久久久久久久久久久久久久| 精品日韩一区二区三区 | jizz国产精品| 精品伦理精品一区| 欧美大喷水吹潮合集在线观看| 红杏成人性视频免费看| 日韩高清欧美高清| 久久婷婷五月综合| 日韩一区二区三区免费播放| 日韩中文字在线| 国产精品99久久久久久成人| 亚洲综合色网| 久久久久久久久亚洲| 久久艹免费视频| 久热re这里精品视频在线6| 国产精品久久久久久搜索| 亚洲视频在线观看免费视频| 韩国成人精品a∨在线观看| 亚洲伊人久久综合| 天天干天天舔天天射| 久久精品欧美日韩精品| 亚洲一二三区在线| 羞羞电影在线观看www| 五月激情六月综合| 色噜噜狠狠永久免费| 国产精品一站二站| 亚洲福利视频网| 亚洲一二三精品| 韩国一区二区三区在线观看| 青青a在线精品免费观看| 怡红院男人天堂| 国产不卡视频在线观看| 欧美亚洲爱爱另类综合| gogo在线观看| 色哟哟一区二区| 日韩精品在线播放视频| 亚洲日产av中文字幕| 另类图片亚洲另类| youjizz在线视频| 精品一区二区在线看| 精品国产一区二区三区久久久久久| 国产综合在线观看| 一区二区三区国产豹纹内裤在线| 日韩视频第二页| 麻豆一二三区精品蜜桃| 亚洲欧美国产精品久久久久久久| 日韩高清dvd碟片| 国产精品嫩草99av在线| 91综合免费在线| 黄网站在线观看| 亚洲五月六月丁香激情| 激情黄色小视频| 亚洲精品aaaaa| 欧美黑人性生活视频| 波多野结衣理论片| 成人av电影免费在线播放| 亚洲欧洲免费无码| 91av亚洲| 亚洲精品一区二区三区福利 | 91精品国产高清久久久久久91| 中文字幕乱码人妻二区三区| 97精品国产97久久久久久久久久久久| 中文字幕久久综合| 成人黄色免费短视频| 亚洲国产日韩欧美在线动漫| 欧美成人一区二区三区高清| 美女在线一区二区| 秋霞在线观看一区二区三区| 2019中文字幕在线电影免费| 欧美日韩高清影院| 天天操天天舔天天射| 亚洲影院免费| 国产精品精品软件视频| 26uuu亚洲电影在线观看| 欧美日韩久久一区| 俄罗斯毛片基地| 久久久精品五月天| 久久精品中文字幕一区二区三区 | 国产精品黄色av| 天堂av在线播放| 亚洲成av人片| 中文字幕免费高清视频| 国内久久精品| 国产成人亚洲欧美| 国产盗摄一区二区| 337p日本欧洲亚洲大胆色噜噜| 欧美三级小视频| 国产精品一级二级三级| 91制片厂免费观看| 成人在线视频区| 美女性感视频久久久 | 日韩av影视综合网| 日韩精品人妻中文字幕| 成人免费三级在线| 久久国产精品视频在线观看| 国产精品久久久久久久久久白浆| 久久久久久国产精品| 亚洲乱码精品久久久久..| 一卡二卡欧美日韩| 精品无码人妻少妇久久久久久| 一区二区亚洲| 久久久婷婷一区二区三区不卡| 欧美在线极品| 亚洲无线码在线一区观看| 最新中文字幕在线观看视频| 国产精品美女久久福利网站 | 成人免费观看视频| 久久久久久久中文| 美女少妇全过程你懂的久久| 国产成人涩涩涩视频在线观看 | 人妻少妇被粗大爽9797pw| 台湾色综合娱乐中文网| 国产精品久久久久久久久久久久久久| 69久久精品| 欧美一区二区三区喷汁尤物| 精品午夜福利视频| 久久久国际精品| 天堂在线中文在线| 亚洲午夜极品| 日韩欧美第二区在线观看| 四虎国产精品永久在线国在线| 久久国产精品久久久| 日本人妻丰满熟妇久久久久久| 色综合久久九月婷婷色综合| 日本黄色片免费观看| 99久久精品情趣| 欧美三级理论片| 欧美先锋影音| 午夜免费电影一区在线观看| 精品久久亚洲| 日本国产欧美一区二区三区| 麻豆网在线观看| 亚洲国产欧美精品| 中文字幕免费播放| 亚洲成av人影院在线观看网| 中文字幕av久久爽一区| 粉嫩嫩av羞羞动漫久久久| 午夜激情福利在线| 亚洲高清资源| 五月天综合网| 久久电影在线| 亚洲精品免费一区二区三区| 在线成人av观看| 萌白酱国产一区二区| 欧美捆绑视频| 欧美mv日韩mv| 国产精品国产一区二区三区四区 | 欧美精品在线免费| 国产在线色视频| 精品国产乱码久久久久久图片| 亚洲婷婷久久综合| 污片在线观看一区二区| 亚洲国产123| 欧美国产一区二区在线观看 | 老牛国内精品亚洲成av人片| 成人黄色免费网站在线观看| 国模套图日韩精品一区二区| 欧美另类高清videos| 18视频免费网址在线观看| 精品视频中文字幕| 亚洲欧美另类一区| 欧美精品在线一区二区| 欧美性猛交xxxx乱大交hd| 亚洲一区在线观看网站| 男人晚上看的视频| 日本一区二区久久| 国产伦精品一区二区三区妓女 | 欧美日韩精品免费观看视频完整| 亚洲精蜜桃久在线| 精品视频在线你懂得| 97视频资源在线观看| 55av亚洲| 国内成人精品一区| 青春草在线免费视频| 麻豆一区二区在线观看| 精品176二区| 爽爽爽爽爽爽爽成人免费观看| 国产精品免费观看| 亚洲精品自产拍| 日韩欧美亚洲系列| 日韩电影网在线| 天堂在线资源网| 亚洲成av人片在线观看香蕉| 欧美 日韩 中文字幕| 亚洲成avwww人| 刘亦菲毛片一区二区三区| 日韩精品一区二区三区视频| 国内精品久久久久久久久久| 欧美一区二区三区免费观看视频| 91精品国自产| 欧美一区二区三区人| www黄色在线观看| 精品人在线二区三区| 国产自产一区二区| 精品国产一区二区三区久久影院| 亚洲乱色熟女一区二区三区| 欧美大片一区二区| 蜜臀久久99精品久久久| 亚洲大胆人体av| 天堂成人在线| 一区二区亚洲精品国产| 在线播放麻豆| 欧美另类第一页| 成入视频在线观看| 日本道色综合久久影院| 欧美日韩尤物久久| 成人免费网站在线看| 中文字幕日韩在线| 久久久影院一区二区三区| 国产精品羞羞答答在线观看 | 日韩美女网站| 久久伊人91精品综合网站| 日韩三级电影视频| 欧美亚洲成人xxx| 欧美午夜三级| 国产精品二区三区四区| 亚洲老女人视频免费| 亚洲精品在线视频观看| 自拍偷拍欧美| 欧美日韩黄色一级片| 男女激情视频一区| 99中文字幕在线| 99精品热视频| jizzjizzjizz国产| 亚洲午夜久久久久| 国产无套丰满白嫩对白| 91精品婷婷国产综合久久| 天天色综合久久| 在线成人中文字幕| 欧美伦理免费在线| 国产精品精品一区二区三区午夜版| 成人综合日日夜夜| 欧美久久在线| 欧美激情视频一区二区三区在线播放 | 日本精品一二三区| 中文字幕免费观看一区| 久久久久亚洲av片无码下载蜜桃| 日韩欧美视频一区二区三区| 国产熟女一区二区三区五月婷| 日韩精品极品在线观看播放免费视频| 网友自拍视频在线| 91精品国产九九九久久久亚洲| 亚洲伦理一区二区| 免费成人深夜夜行视频| 欧美午夜在线| 男生操女生视频在线观看 | 欧美成人短视频| 午夜激情一区二区| 国产乱码精品一区二区| 亚洲欧美日韩视频一区| av手机免费在线观看| 成人黄色免费片| 狠狠综合久久av一区二区蜜桃| 91黄色在线看| 国产麻豆成人传媒免费观看| 中国特黄一级片| 一本色道久久综合亚洲91| 亚洲精品18p| 美日韩在线视频| 亚瑟国产精品| 亚洲精品乱码久久久久久蜜桃91 | 欧美一区二区.| 97精品久久| www.国产亚洲| 九色综合国产一区二区三区| 欧美熟妇激情一区二区三区| 欧美日韩一区二区免费视频| 理论片中文字幕| 欧美国产精品人人做人人爱| 性欧美video另类hd尤物| 亚洲va韩国va欧美va精四季| 天使萌一区二区三区免费观看| 国产熟女高潮一区二区三区| 亚洲成av人片在线| 欧美一级特黄aaaaaa| 欧美丰满少妇xxxxx| 狂野欧美xxxx韩国少妇| 久久久无码中文字幕久...| 精品亚洲aⅴ乱码一区二区三区| 一级特黄曰皮片视频| 欧美性猛交一区二区三区精品| 国产中文在线观看| 国产精品va在线播放我和闺蜜| 欧美极品中文字幕| 免费看a级黄色片| 国产精品色婷婷久久58| 亚洲图片中文字幕| 久久精品视频99| 精品中文视频| 日本黄大片在线观看| 成人免费黄色在线| 国产一级片毛片| 亚洲免费视频一区二区| 激情开心成人网| 亚洲一区二区三区色| 韩国成人福利片在线播放| 永久免费看黄网站| 日韩区在线观看| sm在线观看| 欧美日韩一区在线视频| 日本中文字幕一区二区有限公司| 国产精品成人在线视频| 欧美一区二视频| a'aaa级片在线观看| 欧美高清性xxxxhdvideosex| 三级久久三级久久| 亚洲AV成人无码网站天堂久久| 欧美一级生活片| 激情黄产视频在线免费观看| 日本黑人久久| 国产麻豆精品在线| 99视频在线看| 中文字幕日韩免费视频| 国产一区 二区| 黄色免费视频大全| 国产精品无人区| 精品国产999久久久免费| 午夜欧美不卡精品aaaaa| 国产精品自拍区| 青青草精品在线| 色噜噜狠狠成人中文综合| 国产盗摄在线观看| 国产三级精品在线不卡| 免费观看久久久4p| 欧美三根一起进三p| 亚洲欧美成人在线| 国产免费av国片精品草莓男男| 国产综合中文字幕| 中文字幕国产一区二区| www.激情五月| 国产精品成人一区| 亚洲激情专区| 激情高潮到大叫狂喷水| 亚洲精品久久在线| 国产精品亚洲四区在线观看| 日韩中文字幕在线视频观看| 国产精品国产a|