SpringWebFlux使用函数式编程之RouterFun
环境:Springboot2。4。12
本篇主要内容:RouterFunction的使用概述
路由器函数用于将请求路由到相应的HandlerFunction。通常情况下,你不需要自己编写路由器函数,而是使用RouterFunctions类中的方法来创建一个。RouterFunctions。route()(无参数)为创建路由器函数提供了一个流畅的构建器,而RouterFunctions。route(RequestPredicate,HandlerFunction)提供了创建路由器的直接方法。
通常,建议使用route()构建器,因为它为典型的映射场景提供了方便的快捷方式,而不需要难以发现的静态导入。例如,路由器函数构建器提供了方法GET(String,HandlerFunction)来为GET请求创建映射;和POST(String,HandlerFunction)用于POST。
除了基于HTTP方法的映射之外,路由构建器还提供了一种在映射到请求时引入附加谓词的方法。对于每个HTTP方法,都有一个以RequestPredicate作为参数的重载变体,尽管可以表示附加的约束。谓词Predicates
你可以编写自己的RequestPredicate,但RequestPredites类提供了常用的实现,基于请求路径、HTTP方法、内容类型等。以下示例使用请求谓词根据Accept标头创建约束:RouterFunctionServerResponserouteRouterFunctions。route()。GET(helloworld,accept(MediaType。TEXTPLAIN),requestServerResponse。ok()。bodyValue(HelloWorld))。build();
你可以使用以下命令将多个请求谓词组合在一起:RequestPredicate。and(RequestPredicate)两者必须匹配RequestPredicate。or(RequestPredicate)两者都可以匹配
RequestPredicates中的许多谓词都是组合的。例如,RequestPredicates。GET(String)由RequestPredicates。method(HttpMethod)和RequestPredicates。path(String)组合而成。上面显示的示例还使用了两个请求谓词,因为构建器使用RequestPredicates。GET内部,并用accept谓词组合它。路由Routes
路由器函数按顺序计算:如果第一个路由不匹配,则计算第二个路由,依此类推。因此,在一般路由之前声明更具体的路由是有意义的。这在将路由器函数注册为Springbean时也很重要,稍后将对此进行描述。注意,此行为不同于基于注释的编程模型,后者自动选择最特定的控制器方法。
当使用路由器函数构建器时,所有定义的路由被组合到一个RouterFunction中,该RouterFunction从build()返回。还有其他方法可以将多个路由器功能组合在一起:add(RouterFunction)ontheRouterFunctions。route()builderRouterFunction。and(RouterFunction)RouterFunction。andRoute(RequestPredicate,HandlerFunction)shortcutforRouterFunction。and()withnestedRouterFunctions。route()。
下面的例子展示了四条路由的组合:importstaticorg。springframework。http。MediaType。APPLICATIONJSON;importstaticorg。springframework。web。reactive。function。server。RequestPredicates。;PersonRepositoryrepository。。。PersonHandlerhandlernewPersonHandler(repository);RouterFunctionServerResponseotherRoute。。。RouterFunctionServerResponserouteroute()。GET(person{id},accept(APPLICATIONJSON),handler::getPerson)1。GET(person,accept(APPLICATIONJSON),handler::listPeople)2。POST(person,handler::createPerson)3。add(otherRoute)4。build();带有匹配JSON的Accept头的GETperson{id}被路由到PersonHandler。getPerson带有与JSON匹配的Accept头的GETperson被路由到PersonHandler。listPeople没有附加谓词的POSTperson被映射到PersonHandler。createPersonotherRoute是一个在别处创建的路由器函数,并添加到构建的路由中。嵌套路由NestedRoutes
一组路由器函数通常具有一个共享谓词,例如共享路径。在上面的示例中,共享谓词将是一个与person匹配的路径谓词,由三条路由使用。在使用注释时,可以通过使用映射到person的类型级RequestMapping注释来消除这种重复。在WebFlux。Fn,路径谓词可以通过路由器函数构建器上的路径方法共享。例如,上面例子的最后几行可以通过使用嵌套路由通过以下方式进行改进:RouterFunctionServerResponserouteroute()。path(person,builderbuilder1。GET({id},accept(APPLICATIONJSON),handler::getPerson)。GET(accept(APPLICATIONJSON),handler::listPeople)。POST(handler::createPerson))。build();注意,path的第二个参数是接受路由器构建器的消费者。
尽管基于路径的嵌套是最常见的,但是你可以通过在构建器上使用嵌套方法来嵌套任何类型的谓词。上面的内容仍然以共享的Acceptheader谓词的形式包含了一些重复。我们可以通过使用nest方法和accept来进一步改进:RouterFunctionServerResponserouteroute()。path(person,b1b1。nest(accept(APPLICATIONJSON),b2b2。GET({id},handler::getPerson)。GET(handler::listPeople))。POST(handler::createPerson))。build();
总结:路由函数中RouteFunction的使用嵌套路由的使用
SpringWebFlux使用函数式编程之HandlerFunction(1)
SpringWebFlux请求处理流程
一文带你彻底理解SpringWebFlux的工作原理
SpringBootWebFlux整合SpringSecurity进行权限认证
SpringBootWebFlux整合MongoDB实现CRUD及分页功能
SpringWebFlux入门实例并整合数据库实现基本的增删改查
SpringBootWebFlux整合R2DBC实现数据库反应式编程
喝酸奶患癌风险会下降19,有科学依据吗?权威研究结果公布酸奶,是一种非常受欢迎的奶制品,尤其是对于年轻人不太喜欢,纯牛奶大多都会选择酸奶。购买牛奶的时候,我们会发现酸奶的价格其实比纯牛奶略贵一些。酸奶所含有的营养物质非常丰富,能够帮助强
部分儿童智能手表硬件软件均存在质量漏洞现在,儿童智能手表逐渐成为孩子们的必备品之一,方便家长和在校的孩子联络等。然而,根据江苏省消保委最新的消费调查显示,很多消费者对儿童智能手表质量表示不满,吐槽这类产品存在定位不准信
大范围雨雪形势高度确定,32省都要下!权威预报4省暴雪2省暴雨11月9日上午,从风云四号高清可见光卫星云图上看,之前被持续阴雨笼罩的广东多地今天终于拨云见日,阴云明显减少,回暖进程正全面加速。但与此同时,长江以北地区的阴云正明显增多,西北地区
消保委调查报告显示儿童智能手表存四大问题来源中国消费者报图一为什么选购儿童智能手表(多选)图二儿童智能手表对孩子有什么影响(多选)图三选购儿童智能手表时考虑的要素(多选)(数据来源江苏省消保委)伴随着可穿戴智能设备的兴起
妇产科普冬季养生最怕这几件事,看你中了几个?忌冬季养生最怕这几件事忌暴饮暴食正值岁末年初,此节气期间多有聚会,切记不要暴饮暴食。因为此时,阳气最弱,无法帮助身体运化过多的食物。忌寒凉冬季时节人体的阳气弱,身体的抵抗力也较差,
7张图告诉你什么是自卑,如何应对孩子自卑关注我,并发私信社区,可加入我的育儿社区,6000家长已加入。当孩子问你妈妈,什么是自信?的时候,你会告诉她你的孩子自信吗?这11张图告诉孩子什么是自信我是牛妈彭小蹦,两个孩子的妈
每个孩子的成长中,都该得到3个礼物所有一鸣惊人的奇迹背后,都是父母的奋力托举。身为最平凡最普通的父母,若想养出最懂事最上进的孩子,有这三样东西必不可少。作者可乐妈前段时间,我在后台看到了这样一则留言都说寒门再难出贵
儿子像妈女儿随爸,孩子有4个特征最容易遗传,你家娃中招没常听人说儿子像妈,女儿随爸,这种说法大家还是比较赞同的,毕竟生活中类似的例子有很多。同事庭哥这两天给孩子开家长会的经历,就验证了这一点。庭哥家女儿今年初二,当爸的还是第一次给孩子开
滨图悦读讲给孩子的睡前童话滨州日报滨州网综合讯童话镇听说白雪公主在逃跑小红帽在担心大灰狼听说疯帽喜欢爱丽丝丑小鸭会变成白天鹅听说彼得潘总长不大杰克他有竖琴和魔法听说森林里有糖果屋灰姑娘丢了心爱的玻璃鞋1hr
双十一省钱攻略这4种伪健康零食,孩子千万要少吃!健康你我他双十一的前奏虽然热热闹闹地过去了,但毕竟正日子还没来,相信很多人都在等着憋大招。优惠券攒下了一大堆,就等着时间一到,轰轰烈烈一把!没孩子的给自己买,有孩子的给孩子买,大部分家长的购
窗边的小豆豆每个孩子都是独立的天使无论哪个孩子,当他出世的时候,都具有优良的品质。在他成长的过程中,会受到很多影响,有来自周围的环境的,也有来自成年人的影响,这些优良的品质可能会受到损害。所以,我们要早早地发现这些