范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

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

10款Steam耐玩开放世界游戏推荐,在游戏中实现梦想是真的人生百态,每一个人都有自己的路子,从事着自己的职业,可是这些职业有可能并不是这些人想要的样子,每个人都有他们的梦想。下面我来给大家推荐10款Steam耐玩游戏,对于玩家来说,在这些水墨江湖如画美侠!剑网1归来千人同屏PVP,引爆话题圈江湖不老,侠义永存!就在剑网1归来开启全平台不删档测试的前一天,11月14日,联合发行方西山居和盛趣游戏,在上海豫园举办的以归来为主题游戏发布会,因剑侠情缘初代音乐制作人罗晓音知名盘点10款好玩的沙盒手游,黑暗与光明手游肝座城堡要花数天沙盒游戏在近几年是一种非常火的游戏题材,相比传统游戏,很多玩家已经对日复一日的各种任务所消磨耐心,而沙盒游戏玩法中玩家非常自由,玩家甚至可能连任务都不复存在,玩家拥有极高的游戏自由与方舟手游一脉相承,黑暗与光明手游玩家们活得很真实方舟生存进化手游可以说是目前最受期待的生存沙盒手游之一,完美复刻了Steam同名端游,有着独特的驯龙玩法和生存机制。其实近期热度很高的黑暗与光明手游其实就和方舟生存进化手游一脉相承海盗游戏ATLAS新船只造型霸气,可放置迫击炮轰杀敌军ATLAS是一款以海盗为题材的生存类沙盒游戏,多年以前它在Steam平台正式发布,一上线就吸引到了不少沙盒题材爱好者们的关注。游戏基本上具备了所有传统的沙盒玩法,并在在此基础上发展泪目!初代WE和黑暗势力重聚LOL手游赛场,满满的青春回忆最近斗鱼官宣老OMG和老WE将会在LOL手游赛场重聚,重新给观众们展现当年的经典阵容。此举马上吸引了很多陈年老粉,要知道当年的OMG和WE可是很多人的偶像,他们在世界赛上努力拼搏,炉石传说佣兵战纪即将登场,如何组出一套高强度佣兵阵容?炉石传说的全新RPG玩法佣兵战纪将在10月13日上线。试玩视频中那些玩家打出的精彩操作,以及佣兵角色之间的默契配合,让还没有玩到佣兵战纪的玩家们眼热不已。仅剩三天佣兵战纪就要正式上鱼人将再次崛起!佣兵战记玩法鱼人实力不容小觑热爱魔兽世界的玩家,对于鱼人这个种族一定非常了解。作为魔兽世界重要种族之一,鱼人几乎遍布了整个艾泽拉斯的水域。其中阳鳃鱼人更是因为一些机缘巧合的缘故,在外域扎根下来。作为一支古老的盘点10款硬核生存手游,黑暗与光明手游逃跑都要讲究技巧生存游戏或许对于很多玩家来说都非常陌生,如果你是一名传统的游戏玩家,我相信生存游戏一定会让你觉得很有趣,一般来说,生存游戏中玩家可以像现实世界一样去进行行动,采集,制作食物,建造房10款好玩的Steam游戏大盘点,难以被超越,被玩家称为YYDSSteam游戏平台作为全球最大的游戏平台,在上面有很多优秀的作品。可是能够被玩家奉为YYDS的游戏却并没有多少,以下这10款游戏便是能站立在上万款游戏之巅的作品,哪怕再过几年都很难开辟商船水道,海盗游戏ATLAS诸多帝国靠贸易崛起在Steam平台的海盗游戏专区,游戏数量繁多,每年也都有着新游戏涌现,可见市场竞争激烈,如果想要脱颖而出,就得具备独特优势,ATLAS之所以能够长时间在生存沙盒游戏市场上占据一席之
EDG完全体归来?Scout机场遇突发事件,网友怒斥这不是饭圈EDG作为去年S赛夺冠的队伍,成功在世界舞台上证明了自己的实力,EDG战队的人气也在这之后大幅提升,再过不久,新一届的LPL春季赛将和我们见面,EDG战队能够取得怎样的成绩,也成了会员游戏化身大唐注这里列出的信息均为开发者在indienova自行提交的信息。游戏可能尚在开发和完善中,具体的内容和表现(甚至玩法)在正式上架销售后可能会有所差异。开发团队简乐studio主要类型鬼灭之刃火神血风谭全球累计销量已突破132万开发商CyberConnect2的社长松山洋在2022新年特别直播节目中宣布旗下对战动作游戏鬼灭之刃火神血风谭(DemonSlayerKimetsunoYaibaTheHinoka步伐缓慢的僵尸喝牛奶,吃面包,每天都是一样的固定搭配,这是一种什么体验?锻炼身体我也懒得走了,对于植物大战僵尸这款游戏,你肯定不陌生。咱们换一种身份以及说法重新解读,我个人的理解是这样的。我就是我的世界钻石钻石是一种极其稀有的矿石,在幸运的情况下可在村庄内的铁匠铺箱子中找到。这种矿石大多数在11格以下(建议在天然矿洞中寻找),接近世界边缘。这种稀有矿石可以制作成高强度的盔甲武器,附魔原神2。5池子曝光,2。4你还抽吗?随着时间推移,原神2。3也快要结束了,再过两天就是2。4了,你们喜欢申鹤老婆也将来了,本来是一件欣喜来潮的好事,但伴随着内鬼曝光了2。5角色复刻与卡池后,小编瞬间觉得2。4不香了根光遇热门装扮全部返场,二次复刻有看点,搓澡巾要来了?光遇热门装扮全部返场,二次复刻有看点,搓澡巾要来了?前言大家好,我是喜欢玩游戏聊游戏的孟婆小叔。2021年恍然结束,回顾过去的一年,国服的复刻,充满了喜剧性,比如灯笼裤复刻,这是因Uzi训练赛杀疯了!刘青松向Doinb透露,BLG获胜后对面直接不打了各位LPL的观众和英雄联盟召唤师大家好,这里是天下游戏汇。LPL各支战队目前正处于紧张的备战状态,这一次LPL各大队伍以及选手的努力程度相比于之前更高了,因此今年的LPL春季赛精彩直击新年之夜庆典战舰世界跨年行动送稀有战舰新年庆典齐欢聚,三重福利诚意足!随着2022年元旦的到来,战舰世界中的魔法星星们也操办起了所有指挥官的新年庆典。这次庆典还邀请到了三位雪巨人,引导大家完成独特的庆典目标。各位战舰的西山居新作剑侠世界3火爆上线,你要找的经典武侠就在这里作为西山居剑侠情缘25周年致敬经典武侠之作,剑侠世界3在全平台上线当天就登录了AppStore的推荐榜单,并占领了AppStore免费总榜榜首,时至今日依旧蝉联。而早在官方放出预下青丘奇缘,先秦爱情故事嗨喽,大家好,千青又跟大家见面了,本期给大家推荐的是大型国风仙侠手游青丘奇缘(真充大乐透)青丘奇缘(真充大乐透)是一款3D自由飞行仙境冒险手游。游戏简介在唯美的3D开放大世界,玩家