SpringWebFlux使用函数式编程之FilteringHandlerFunctions
环境:Springboot2.4.12
本篇主要内容: RouterFunction中使用过滤器 URL处理组件
请先阅读: 《Spring WebFlux使用函数式编程之HandlerFunction(1)》《Spring WebFlux使用函数式编程之RouterFunction(2)》概述
你可以通过在路由函数构建器上使用before 、after 或filter 方法来筛选处理程序函数。通过使用注释,你可以通过使用@ControllerAdvice 、ServletFilter 或两者都可以实现类似的功能。过滤器将应用于构建器构建的所有路由。这意味着在嵌套路由中定义的过滤器不适用于"顶级"路由。例如,考虑下面的例子:RouterFunction route = route() .path("/person", b1 -> b1 .nest(accept(APPLICATION_JSON), b2 -> b2 .GET("/{id}", handler::getPerson) .GET("", handler::listPeople) .before(request -> ServerRequest.from(request) // 1 .header("X-RequestHeader", "Value") .build())) .POST("/person", handler::createPerson)) .after((request, response) -> logResponse(response)) // 2 .build();添加自定义请求头的before 过滤器只应用于两个GET路由。记录响应的after 过滤器应用于所有路由,包括嵌套路由。
路由器构建器上的filter方法接受HandlerFilterFunction :一个接受ServerRequest 和HandlerFunction 并返回ServerResponse 的函数。处理程序函数参数表示链中的下一个元素。这通常是路由到的处理程序,但如果应用了多个过滤器,它也可以是另一个过滤器。完整示例
处理程序句柄@Component public class PersonHandler { 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")), "中国")) ; } private Errors validate(Person person) { Errors errors = new BeanPropertyBindingResult(person, "person"); validator.validate(person, errors); if (errors.hasErrors()) { return errors ; } return null ; } }
路由配置@Configuration public class PersonHandlerConfiguration { @Resource private PersonHandler ph ; @Bean public RouterFunction 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(); } }
POJOpublic class Person { private Integer id ; @NotEmpty(message = "姓名必须填写") private String name ; }URL处理组件
URL组件可以在Spring MVC and Spring WebFlux中都可以使用。
UriComponentsBuilder 帮助从带有变量的URI模板构建URI,如下例所示:UriComponents uriComponents = UriComponentsBuilder .fromUriString("https://pack.com/lovers/{lover}") // 1 .queryParam("q", "{q}") // 2 .encode() // 3 .build(); // 4 URI uri = uriComponents.expand("lover", "hcw").toUri(); // 5使用URI模板的静态工厂方法添加或替换URI组件请求对URI模板和URI变量进行编码建立一个UriComponents展开变量并获得URI
以上代码运行结果:https://pack.com/lovers/lover?q=hcw
上面的例子可以合并为一个链,并使用buildAndExpand 进行缩短,如下面的例子所示:URI uri = UriComponentsBuilder .fromUriString("https://pack.com/lovers/{lover}") .queryParam("q", "{q}") .encode() .buildAndExpand("lover", "hcw") .toUri();
你可以通过直接进入URI(这意味着编码)来进一步缩短它,如下面的例子所示:URI uri = UriComponentsBuilder .fromUriString("https://pack.com/lovers/{lover}") .queryParam("q", "{q}") .build("lover", "hcw");
你可以使用完整的URI模板进一步缩短它,如下例所示:URI uri = UriComponentsBuilder .fromUriString("https://pack.com/lovers/{lover}") .build("lover", "hcw");
完毕!!!
Spring容器这些扩展点你都清楚了吗?
Spring事务实现原理源码分析
Spring中的@Configuration注解你真的了解吗?
SpringBoot对Spring MVC都做了哪些事?(一)
SpringBoot对Spring MVC都做了哪些事?(二)
SpringBoot对Spring MVC都做了哪些事?(三)
SpringBoot对Spring MVC都做了哪些事?(四)
Webbeds泰国旅游峰会在曼谷举行重点关注中国市场峰会现场王贤思摄中新网曼谷2月9日电(王国安王贤思)Webbeds2023年泰国旅游峰会当地时间2月8日在曼谷举行,众多泰国本地及境外旅游企业代表参会。嘉宾演讲王贤思摄嘉宾演讲王贤
上热搜的这件事,立案调查!日前导游回应不达购物标准不给游客房卡冲上热搜引发网友关注导游心知肚明我们是购物团2月6日,一游客参加广西某旅行团时被强制购物,因消费不达标,导游不给房卡,双方发生争执。该团行程表显
景点买的便宜佛珠手串救了我不信鬼神的我却偏偏遇到一桩诡异的事件,小小的佛珠手串竟然在危险来临之前给我示警,让我免去了一桩车祸灾难。这串佛珠是8。9年前在随公司团队去外地旅游的时候在山上一个景点的小摊上买的,
中国6大地域错觉没去过就很难相信,新疆被误会最多仅凭着初中地理课上学来的一鳞半爪,还远远谈不上了解世界。我们对这个世界,还存在着太多的误解和不切实际的想象。当你真正踏上梦中的土地,一些知识会被印证而有些知识,则会被彻底推翻。我以
谈谈今年春节去潮州和厦门旅游的感受我们正月初七从广州南站坐高铁到潮州,住在牌坊街附近的桔子酒店,当天入住的时候酒店挂牌房价已经1000元左右了,幸亏老公机智提前订好房间。放下行李已经饥肠辘辘,出来找吃的,2家没到营
新加坡旅游,代办签证,国际机票,新加坡3日游团队推荐新加坡是东南亚的一个岛国,也是一个城市国家。该国位于马来半岛南端。新加坡用自己的繁荣整洁娱乐民风气候吸引着游客纷至沓来。想去新加坡旅游的小伙伴们看过来啦,新加坡3日游推荐,还有特价
这个巨大的洞穴,可以容纳78亿人?来参观一次需花费2万对于神秘的地底世界,所有人都充满了好奇。有一处神奇的地下洞穴,它是一直是地心冒险者想要探索与征服的目标之一。这里和其他山洞最明显的不同之处,就是这个洞穴足够大,它大到足以容纳参天大
广西黄姚烟雨似梦游人穿巷品味古今图为一民众购买当地特色美食豆豉。俞靖摄一老者闲坐在铺子里招揽来往游客。俞靖摄游人穿行在古建筑间。俞靖摄古镇云雾缭绕,宛若仙境。俞靖摄航拍黄姚古镇,游船在烟雨中行进。俞靖摄民众在古镇
元宵节单日游客10万人次,杨家埠文旅片区春节活动空前火爆鲁网2月9日讯(记者王玉龙通讯员李娜)品地道年味,赏民俗花灯。2023年1月22日2月8日,从大年初一开幕到正月十八收官,历时18天,潍坊市寒亭区杨家埠文旅片区春节活动完美绽放。景
记者欧超联赛无永久成员A22认为五大联赛仅英超有可持续性直播吧2月9日讯CBS记者雅各布斯在社交媒体上谈到了欧超联赛发布的改动细节,他表示欧超联赛不会有永久成员,赛事推广方认为欧洲五大联赛中的四个联赛不具备可持续性,而欧超联赛能够让俱乐
西湖残荷开始清理预计两周时间完成想拍照的市民游客抓紧啦秋阴不散霜飞晚,留得枯荷听雨声。西湖的残荷成为了杭州冬日里一份独特的萧瑟之美,为了满足市民游客的观赏需求,西湖水域管理处一直尽可能延长西湖残荷的保留时间。近日,杭州市西湖水域管理处