专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

WebFlux中的请求地址路由怎么玩?

  在 SpringMVC 中,我们可以通过如下一些注解来控制请求 URL 和处理器之间的映射关系:  @RequestMapping  @GetMapping  @PostMapping  @DeleteMapping  @PutMapping
  这些注解我们在 WebFlux 中依然还可以继续使用,不过 WebFlux 也提供了自己的方案--Router。
  今天我们就一起来学习下 Router 的用法。  1.项目创建
  首先我们还是先来新建一个 WebFlux 项目,选择的依赖也和之前的一样,如下图:
  这里我们还是基于 MongoDB 来做。
  创建完成后,在 application.properties 中配置一下 MongoDB,如下:  spring.data.mongodb.port=27017 spring.data.mongodb.host=127.0.0.1 spring.data.mongodb.username=madmin spring.data.mongodb.password=m123 spring.data.mongodb.database=test spring.data.mongodb.authentication-database=admin
  如此,我们的准备工作就算完成了。  2.MongoDB 的准备工作
  接下来我们再为 MongoDB 的使用做一些准备工作。
  首先我们需要一个实体类:  @Document public class Person {     @Id     private Long id;     private String name;     private String address;      public Long getId() {         return id;     }      public void setId(Long id) {         this.id = id;     }      public String getName() {         return name;     }      public void setName(String name) {         this.name = name;     }      public String getAddress() {         return address;     }      public void setAddress(String address) {         this.address = address;     } }
  然后我们需要一个 Repository,如下:  @EnableMongoRepositories public interface PersonRepository  extends ReactiveMongoRepository { }
  这个 PersonRepository 的内容很简单,就继承自 ReactiveMongoRepository 即可,和上篇文章中介绍的也基本一致,松哥不再赘述。  3.开发处理器
  接下来我们来开个一个 Person 的处理器,如下:  @Component public class PersonHandler {     @Autowired     PersonRepository personRepository;      public Mono addPerson(ServerRequest serverRequest) {         return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON)                 .body(personRepository.saveAll(serverRequest.bodyToMono(Person.class)), Person.class);     }      public Mono deletePerson(ServerRequest serverRequest) {         return personRepository.findById(Long.parseLong(serverRequest.pathVariable("id")))                 .flatMap(p -> personRepository.delete(p).then(ServerResponse.ok().build()))                 .switchIfEmpty(ServerResponse.notFound().build());     }     public Mono getAllPerson(ServerRequest serverRequest) {         return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON)                 .body(personRepository.findAll(), Person.class);     } }
  关于这个处理器,松哥有话说:  首先这个处理器我们需要将其注入到 Spring 容器中,注入时作为一个普通组件注入即可。  所有方法的返回值类型都是  Mono ,参数类型都是 ServerRequest,因为一会配置 Router 时涉及到的 HandlerFunction 里边就是这样定义的,换句话说,我们这里定义的每一个方法都满足 HandlerFunction 函数式接口。 addPerson 方法中,首先调用 ServerResponse.ok() 方法设置响应状态码为 200,然后调用 contentType 设置响应的 MediaType,最后调用 body 方法设置响应内容。  deletePerson 中,先查询要删除的数据,然后再删除即可。
  上面的写法有点臃肿,一些静态方法我们可以直接使用静态导入,这样代码看起来更清爽一些,修改后的代码如下:  import static java.lang.Long.parseLong; import static org.springframework.http.MediaType.APPLICATION_JSON; import static org.springframework.web.reactive.function.server.ServerResponse.notFound; import static org.springframework.web.reactive.function.server.ServerResponse.ok;  @Component public class PersonHandler {     @Autowired     PersonRepository personRepository;      public Mono addPerson(ServerRequest serverRequest) {         return ok().contentType(APPLICATION_JSON)                 .body(personRepository.saveAll(serverRequest.bodyToMono(Person.class)), Person.class);     }      public Mono deletePerson(ServerRequest serverRequest) {         return personRepository.findById(parseLong(serverRequest.pathVariable("id")))                 .flatMap(p -> personRepository.delete(p).then(ok().build()))                 .switchIfEmpty(notFound().build());     }     public Mono getAllPerson(ServerRequest serverRequest) {         return ok().contentType(APPLICATION_JSON)                 .body(personRepository.findAll(), Person.class);     } }
  修改后的代码看起来简洁一些了,上面多了一些静态导入。我们在网上看别人写的响应式代码,大部分也都是上来就  ok()... 。 4.配置路由
  接下来我们来配置路由,就是将请求的 URL 地址和这些处理器之间关联起来,配置类如下:  @Configuration public class RouterConfiguration {     @Bean     RouterFunction personRouter(PersonHandler personHandler) {         return RouterFunctions                 .nest(RequestPredicates.path("/person"),                          RouterFunctions.route(RequestPredicates.POST("/"), personHandler::addPerson)                                 .andRoute(RequestPredicates.GET("/"), personHandler::getAllPerson)                                 .andRoute(RequestPredicates.DELETE("/{id}"), personHandler::deletePerson));     } }
  这个配置类是这样:  这个配置类的作用有点像 SpringMVC 中的 DispatcherServlet,负责请求的分发,根据不同的请求 URL,找到对应的处理器去处理(如果 DispatcherServlet 不熟悉的话,可以在公众号后台回复  springmvc源码  查看松哥之前关于 SpringMVC 源码分析的系列文章)。 通过 RouterFunctions 这样一个工具类来创建 RouterFunction 实例。  首先调用 nest 方法,第一个参数配置的相当于是接下来配置的地址的一个前缀,这有点类似于我们在 Controller 类上直接写 @RequestMapping 注解去配置地址。  nest 方法的第二个参数就是 RouterFunction 实例了,每一个 RouterFunction 实例通过 RouterFunctions.route 方法来构建,它的第一个参数就是请求的 URL 地址(注意这个时候配置的地址都是有一个共同的前缀),第二个参数我们通过方法引用的方式配置了一个 HandlerFunction,这个就是当前请求的处理器了。  通过 addRoute 方法可以配置多个路由策略。
  OK,如此,我们的配置工作就算完成了。  5.测试
  接下来我们来进行简单的测试。
  我们一共有三个接口可以测试,先来看添加数据:
  这个添加接口其实也可以实现修改,如果添加的数据已经存在就会自动修改,不存在就添加(根据 id 判断数据是否存在)。
  再来看删除数据:
  如果删除的数据不存在,就会响应 404,如下:
  如果删除的数据存在,则会响应 200:
  最后再来看查询的接口:
  如此,我们的 CURD 都 OK 啦。
  原文链接:https://mp.weixin.qq.com/s/-26PoTL2KPXmzz6NG8EhuQ

王者荣耀辅助到底要跟谁?三点技巧带你破解这道峡谷难题辅助作为阵容中的游走位,近几个版本在场上的职责和作用变得愈发重要,一个会玩的辅助可以成为团队的润滑剂。无论是射辅连体野辅联动还是中辅联动,辅助在任何一条线上的双人小节奏都非常容易建游戏迷狂喜!乐高首个地平线零之曙光套装将于2022年发布在圣诞节即将到来之际,有一个对于所有乐高迷和游戏迷都非常激动的消息,游戏大作地平线零之曙光的首个乐高套装将在2022年5月发布!这件套装的名字出现在在线零售商wagners24的一英雄联盟手游高帧率来了!适配机型公布英雄联盟手游高帧率模式来了!12月22日晚间,英雄联盟手游公布了2。6A版本,迎来了正义天使凯尔堕落天使莫甘娜这两位新英雄,重做的蒙多医生,无限火力模式限时开启(12月27日180热血传奇真正的珍品装备你见过几个?谈起传说中的武器你的反应是什么,屠龙,那应该是很多人梦寐以求的。但是这样的极端武器通常只有少数人才能拥有。在今天讲述传奇中同样宝贵的装备。1火把传说初出时,玛法大陆仍有昼夜之分。一冬天爷爷来啦!和蔼可亲的冬天爷爷不用海盗炉石传说冬幕节已经开始了,冬天爷爷又来到酒馆给大家送礼物了!今年的冬幕节,冬天爷爷不仅带来了奖励六个卡包的任务线,欢乐的乱斗模式,还把自己的衣服借给了代言人麦格尼铜须,让他化身冬天热血传奇直到打祖玛的时候才发现这枚特戒有多厉害在传奇中,有一颗特戒曾存在感较低,那就是隐形戒指。隐形戒指没有任何属性,戴完后处于隐形状态,唯一的好处就是可移动隐身,而且只要戒指不取下,道士的隐身技术就永远不会消失。起初,戒指被王者荣耀新英雄金蝉的出装铭文及打法思路新英雄金蝉已经上线一个多月了,相信很多小伙伴都被金蝉折磨的欲仙欲死,想要入坑又不清楚怎么玩,那么今天为大家带来金蝉的出装铭文及打法思路。出装铭文属性打法思路玩法误区出装出神速鞋加快吃鸡跑车皮肤实战效果!没有光效的加持,音效不及玛莎拉蒂务实不浮夸!我是你们的情报小能手,微笑十倍镜。吃鸡手游和平精英期待值拉满的跑车皮肤终于在近期实装!兰博基尼的联名皮肤也终于从虚空变成了现实,对于许多男性玩家而言,这是一款最值得期待外媒谈对辐射5期待的内容你有什么新期望呢距离上一部辐射系列已经过去好几年了,而之前我们曾报道过Bethesda的制作人ToddHoward承认他们已经有了一份辐射5的大纲,并且不会让其他工作室制作。外媒GamesradaScoutJiejie领衔新赛季五大中野,YM双人组最值得期待各位LPL的粉丝大家好,这里是小车侃联盟。距离2022年LPL春季赛开赛还有半个月左右的时间,各支队伍的首发阵容基本已经确定完毕。由于当前版本中野强势的重要性,谁能在中路取得线权配原神萌新升级的路线,不要跳关,世界等级都不需要卡游戏中的笔杆王者,每日靠玩游戏过日子,玩网游也有20个年头,我有自己独特的见解,作为一个10年不脱坑的老玩家,如果文章写的有什么问题,请重喷!如果大家觉得好,请转发加点赞!非常感谢
微软开源的物联网入门教程火了大家好,我是努力学习物联网开发的小金!这不,今天又来了一个顶级的物联网教程!这个项目最近还登上了GithubTrending榜单!深受想要学习物联网开发的朋友们的喜爱!开始正式推荐GitHub上标星9。4K的云盘系统推荐一个很火的开源项目Cloudreve云盘系统,现在GitHub有9。4K的Star。Cloudreve可助你快速搭建属于自己的网盘系统,该系统支持不同的云存储平台,比如七牛阿里推荐一个微信小程序商城项目推荐一款实用的微信小程序商城项目,这个项目不仅有商城基本的功能,比如商品管理订单管理用户管理,还有分销功能,具备广告优惠券等功能。技术选型后端采用Spring技术栈,使用到的框架主10个解放双手实用在线工具,有些代码真的不用手写AliyunJavaInitializr在日常开发工作和自己学习跑demo的时候,往往都需要快速构建一个springboot基础工程。除了用IDEA开发工具构建,更多就是用Spri推荐一个基于SpringBootMybatisVue的代码生成器1。简介一款代码生成工具,可自定义模板生成不同的代码,支持MySQLOracleSQLServerPostgreSQL。只需要一个Java8环境,下载后即可运行使用。步骤简单,只需SpringBootVue企业级支付系统!附源码项目介绍Jeepay是一套适合互联网企业使用的开源支付系统,支持多渠道服务商和普通商户模式。已对接微信支付,支付宝,云闪付官方接口,支持聚合码支付。Jeepay使用SpringBo一次完整的JVM堆外内存泄漏故障排查记录前言记录一次线上JVM堆外内存泄漏问题的排查过程与思路,其中夹带一些JVM内存分配的原理分析以及常用的JVM问题排查手段和工具分享,希望对大家有所帮助。在整个排查过程中,我也走了不一段白话丨3000块买芯送手机,速度与情怀并存却被称电子垃圾从上个月iPhoneSE发布以来,老果粉们纷纷指出苹果是在清库存,称新版iPhoneSE是电子垃圾。单从配置出发,新款iPhoneSE与iPhone8九成的配置都一模一样,肉眼能看测一测你是不是局部有钱人局部有钱人指处于充裕但有限状态的一群人可以把他们比喻成最近爆火的游戏人生重开模拟器,他们只盯着其中一到两项技能树全部点满,剩下的则是顺其自然。在消费水平上,他们会在喜爱的领域将自己球王会畅聊姆巴佩脱离巴黎的态度坚决,皇马有望免签姆巴佩姆巴佩与巴黎的合同期将于明年夏天到期,他至今没有接受继续签约。梅西加入巴黎后,姆巴佩远离了成为核心的愿望,使他更加坚定。据西班牙电视6台报道,姆巴佩决定和巴黎摊牌。但是,迪马济奥和球王会,新赛季支出最多的十大联赛榜单,英超排在首位目前的欧洲十大联赛中,就属英超的支出是最多的。皇马等球队一直坚持在欧洲超级联赛计划可能就是因为自身的支出能力并不能匹配英超目前的实力。其实说到支出实力最强的就要算是切尔西和曼城了,
友情链接:快好知快生活快百科快传网中准网文好找聚热点快软件