精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

一区二区高清不卡| 无码人妻精品一区二区| 日韩精品久久久久久久软件91| 亚洲手机成人高清视频| 国产精华一区二区三区| 国产又黄又爽又色| 日韩在线理论| 精品人伦一区二区色婷婷| www在线观看免费| 国产一级片在线| 国产一区二区在线免费观看| 午夜精品视频在线| 婷婷丁香综合网| 99re热精品视频| 色悠久久久久综合欧美99| 亚洲国产精品影视| 亚洲欧美日本在线观看| 久久se精品一区二区| 国内精品400部情侣激情| 中文字幕av观看| 日韩毛片免费视频一级特黄| 亚洲一区二区高清| 日韩欧美手机在线| www.成人在线观看| 奇米精品一区二区三区在线观看| 欧美老女人在线视频| 性久久久久久久久久| 精品中文在线| 色狠狠色噜噜噜综合网| 免费日韩在线观看| 国产美女视频一区二区三区| 懂色av一区二区夜夜嗨| 国产精品免费电影| 日韩三级av在线| 中出一区二区| 自拍偷拍亚洲一区| 少妇精品一区二区三区| 哺乳一区二区三区中文视频| 欧美日韩日本视频| 国产日产欧美视频| 日本在线视频www鲁啊鲁| 国产精品网站一区| 欧美在线播放一区二区| 六月丁香色婷婷| 国产伦精品一区二区三区免费| 国产精品久久久久久超碰| 圆产精品久久久久久久久久久| 综合久久十次| 色综久久综合桃花网| 91玉足脚交白嫩脚丫| 国产精品2023| 欧美va在线播放| 涩多多在线观看| 国产成人精品一区二区三区视频| 色视频一区二区| 日韩欧美在线播放视频| 国模私拍一区二区国模曼安| 亚洲一区二区黄色| 国产精品国三级国产av| 中文字幕有码在线观看| 一区二区在线观看免费视频播放| 制服诱惑一区| 在线免费看黄网站| 国产精品成人在线观看| 亚洲精品在线免费看| 高清国产福利在线观看| 国产欧美一二三区| 日韩欧美精品久久| 性开放的欧美大片| 国产欧美一区二区精品性色超碰| 视频二区一区| 91社区在线观看| 国产精品久久久99| 一区在线电影| 国产精品一区二区三区视频网站| 亚洲激情成人在线| 免费人成在线观看视频播放| 懂色av一区| 同产精品九九九| 人妻熟女一二三区夜夜爱| 国产高清不卡| 欧美性大战久久| 中文字幕22页| 一区二区三区在线免费看 | 波多野结衣一区二区三区四区| 亚洲一区国产| 日韩美女在线观看一区| 中文字幕黄色av| 国产一区在线观看视频| 动漫一区二区在线| 视频一区二区在线播放| 中文幕一区二区三区久久蜜桃| 亚洲啪啪av| 最新av在线播放| 午夜精品久久久久| 欧美精品一区二区三区免费播放| 午夜精品久久久久久毛片| 日韩欧美一区二区在线视频| 九九精品在线观看| 国产精品精品软件男同| 国产综合自拍| 欧美整片在线观看| 136福利视频导航| 国产不卡高清在线观看视频| 欧美高清视频一区| 成人video亚洲精品| 亚洲va韩国va欧美va精品 | 肉丝袜脚交视频一区二区| 国产欧美日韩中文字幕| 国产综合无码一区二区色蜜蜜| 久久先锋影音av鲁色资源网| 亚洲成年人专区| 综合日韩av| 日韩欧美一区在线| www久久久久久久| 海角社区69精品视频| 日韩av片电影专区| 亚洲av无码乱码国产精品| 久久综合国产精品| 大胆欧美熟妇xx| 国产成人精品一区二区三区免费| 亚洲第一视频在线观看| 亚洲色图27p| 在线视频精品| 91亚洲精品丁香在线观看| 免费一级在线观看| 亚洲午夜激情网页| 五月天中文字幕在线| 亚洲人成亚洲精品| 欧美精品video| 91影院在线播放| 国产亚洲欧美一级| 一二三四视频社区在线| 精品亚洲二区| 久久视频国产精品免费视频在线| 99久久久久久久久| 成人avav在线| 国产成人亚洲综合无码| 国产精品久久久久久妇女| 国产视频亚洲视频| 日韩精品一区三区| 国产精品一区二区久久精品爱涩| 婷婷五月色综合| a一区二区三区| 亚洲国内精品在线| 久青草免费视频| 国产精品一区二区你懂的| 中文字幕免费在线不卡| 免费一区二区三区四区| 亚洲一品av免费观看| 啦啦啦免费高清视频在线观看| 国产91高潮流白浆在线麻豆 | 91精品国产高清久久久久久91裸体| 成年网站在线| 91传媒视频在线播放| 好吊日免费视频| 在线观看视频日韩| 成人女保姆的销魂服务| 麻豆影院在线| 欧美福利电影网| 国产成人在线网址| 久久99久久99精品免视看婷婷| 日韩福利视频| 成人午夜在线| 色婷婷**av毛片一区| 影音先锋国产在线| 国产精品久久久久久久浪潮网站 | 日韩精品免费看| 日韩 欧美 综合| 91一区二区在线| 无码人妻丰满熟妇区毛片18| 免费观看久久av| 国产91在线播放九色快色| 国产三级视频在线播放线观看| 91九色最新地址| 美国黑人一级大黄| 久久电影网站中文字幕| 永久域名在线精品| 日韩成人久久| 91精品国产91| 你懂的在线视频| 欧美亚洲禁片免费| 免费成人美女女在线观看| 国产一区二区剧情av在线| 污污污污污污www网站免费| 精品日产乱码久久久久久仙踪林| 久久久在线视频| 九色视频成人自拍| 欧美精品久久久久久久久老牛影院 | 真人做人试看60分钟免费| 97青娱国产盛宴精品视频| 5252色成人免费视频| 国产精品一区在线看| 在线不卡中文字幕| 九九九国产视频| 久久久久久99久久久精品网站| 制服丝袜综合网| 国内视频精品| 视频一区二区三| 96sao在线精品免费视频| 日韩女优在线播放| 高潮毛片在线观看| 亚洲久久久久久久久久久| 一区二区三区免费在线| 亚洲精品日产精品乱码不卡| 强伦人妻一区二区三区| 国产一区二区三区久久悠悠色av| 国产黄视频在线| 欧美电影免费| 久久久久se| 欧美a级大片在线| 日韩免费在线播放| 色黄网站在线观看| 亚洲视频视频在线| 亚洲va天堂va欧美ⅴa在线| 91精品福利在线| 久久久久久免费观看| 日本一区免费视频| 国产原创剧情av| 九色porny丨国产精品| 欧洲黄色一级视频| 午夜国产欧美理论在线播放| 五月天丁香综合久久国产 | 蜜桃视频动漫在线播放| 久久中文久久字幕| 男人av在线| 精品国产免费视频| 国产喷水吹潮视频www| 色综合久久综合中文综合网| 久久婷婷国产麻豆91| 亚洲色图视频网| 免费看黄色三级| 91影院在线免费观看| zjzjzjzjzj亚洲女人| 韩国欧美国产一区| 蜜臀av免费观看| 久久亚洲二区| 37pao成人国产永久免费视频| 国产精品分类| 在线观看成人免费| 婷婷久久国产对白刺激五月99| 日韩精品一区二区三区第95| 凹凸精品一区二区三区| 黑人巨大精品欧美一区二区三区 | 91欧美一区二区三区| 日韩国产在线观看一区| 免费看国产曰批40分钟| 免费精品国产| 久久资源av| 日韩在线麻豆| 久久精品日韩精品| 18国产精品| 成人av免费在线看| 伊人久久影院| 91色视频在线导航| 国产精品亚洲欧美日韩一区在线| 国产精品三级网站| 欧美大片黄色| 欧美激情在线观看视频| 免费污视频在线| 久久久免费精品| 金瓶狂野欧美性猛交xxxx| 欧美激情久久久| 福利小视频在线| 97视频免费看| 英国三级经典在线观看| 欧美中文字幕在线观看| 亚洲女色av| 国产精品香蕉在线观看| 四虎国产精品永久在线国在线| 91久久精品国产91性色| 日韩精品中文字幕吗一区二区| 99热在线播放| 加勒比中文字幕精品| 美媛馆国产精品一区二区| 国产精品手机在线播放| 亚洲精品美女久久7777777| 91一区二区| 国产女教师bbwbbwbbw| 亚洲看片免费| 国产成人黄色网址| 国产一区二区三区不卡在线观看| 久久人妻少妇嫩草av蜜桃| 99久久久久久99| 国产一二三四区在线| 亚洲天堂中文字幕| 国产五月天婷婷| 91久久一区二区| 国产又粗又大又爽视频| 日韩精品一区二区在线观看| 天天干,天天操,天天射| 国产亚洲精品va在线观看| 激情视频在线观看| 97福利一区二区| 成人a在线观看高清电影| 91亚洲精华国产精华| 老司机凹凸av亚洲导航| 深夜福利成人| 亚洲美洲欧洲综合国产一区| 北条麻妃视频在线| 国产精品一区免费在线观看| 9.1成人看片免费版| 亚洲欧美二区三区| 黑人一级大毛片| 制服丝袜中文字幕亚洲| 日本免费不卡| 欧美激情国产精品| 91国拍精品国产粉嫩亚洲一区| 国产精品久久久久久久久久久久冷 | 日本一区网站| 精品二区久久| 九色porny自拍| 99re这里只有精品首页| 91精品国产高清一区二区三蜜臀| 一本色道a无线码一区v| 黄色片一区二区| 久久久精品久久| 欧美精选视频一区二区| 国产综合动作在线观看| 中文在线播放一区二区 | 欧美一级高潮片| 6080亚洲精品一区二区| 精品福利视频导航大全| 69久久夜色精品国产7777| 日本精品在线播放| 亚洲人久久久| 日本不卡视频在线观看| 97人妻精品一区二区三区免 | 欧美精品在欧美一区二区| 麻豆成人91精品二区三区| 国产精品扒开腿做爽爽| 五月婷婷综合在线| 亚洲国产精品国自产拍久久| 精品国产欧美一区二区三区成人| 日韩国产网站| 欧美自拍资源在线| 国产亚洲在线观看| 人妻激情偷乱频一区二区三区| 亚洲图片你懂的| 夜夜爽妓女8888视频免费观看| 亚洲国产精品人人爽夜夜爽| 黄网在线免费| 欧美精品videos另类日本| 日韩福利影视| 一区二区三区四区国产| 日本一不卡视频| 国产馆在线观看| 色狠狠一区二区三区香蕉| 超碰在线播放97| 欧美国产日本高清在线| 高清久久精品| 色哟哟免费网站| 国产又黄又大久久| 在线免费观看亚洲视频| 日韩午夜在线观看| a天堂中文在线官网在线| 亚洲一区二区三区乱码aⅴ| 欧美顶级大胆免费视频| 欧美乱做爰xxxⅹ久久久| 国产成人精品亚洲777人妖| 成人免费视频国产免费观看| 日韩一区二区免费高清| 黄视频网站在线看| 成人动漫视频在线观看完整版| 影音先锋成人在线电影| 免费黄视频在线观看| 亚洲精品中文字幕在线观看| 亚洲国产一二三区| 久久91亚洲精品中文字幕| 成人在线视频你懂的| 精品一二三四五区| 97久久超碰国产精品| 成人毛片18女人毛片| 一区二区三区 在线观看视| 日韩高清中文字幕一区二区| 亚洲电影一二三区| 久久国产欧美日韩精品| 精品一区二区三区蜜桃在线| 在线不卡的av| 青青青青在线| 国产精品美女黄网| 夜夜嗨av一区二区三区网站四季av| 91成年人网站| 欧美亚洲一区二区三区四区| 中文字幕在线观看播放| 国产99视频精品免费视频36| 久久国产精品久久w女人spa| aaaaa级少妇高潮大片免费看| 欧美色中文字幕| 成人在线免费看片| 久久精品99久久| 日韩**一区毛片| 国产一级在线播放| 亚洲美女性视频| 国产精品免费精品自在线观看 | 亚洲久久久久久| 精品视频一区三区九区| 国产一二区在线| 欧美日韩一区二区视频在线| 蜜臀国产一区二区三区在线播放|