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

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

这些单机手游玩的人不多,但真的很好玩文kiko后台有人说很久没有推荐好玩的单机手游了,在这个尴尬的周三,就把Kiko私心收藏的一些游戏分享给大家吧!它们或许比较冷门小众,但是确实挺好玩的。不知道有没有你喜欢的或者你也天影沉默最精彩的一次沙巴克,爆的你连回城石都没了在传世中玩家的装备用是排在第一位的,装备所增加的属性永远是最高的,但到了沉默版本中就不是这样的这些装备所增加的属性也就不是那么的明显了,还是需要玩家们去强化一些别的东西,在传奇后来我终于知道,为什么我在拼多多玩斗地主,总是输多赢少了在新手场,拼多多斗地主开局的准入门槛是1000欢乐豆。当我欢乐豆大于一千不足三千的时候,我的牌是这样的一眼看去,四个五四个六三个七两个八十以上的牌只有个对二。2000欢乐豆时的牌地LOL现在ADC现状现在下路对线,双方辅助各自找对面AD爆锤,结果双方辅助一人一个人头。现在是拿半血的辅助或者中单钓鱼,对面可能不会激动,如果一个半血的AD,对面就会像打了鸡血一样马上冲上来一顿爆锤,DOTA团战中最厉害的大招是哪个?dota这个游戏经过数年的发展,一直在往更好的平衡性上走。dota作为一个5v5的游戏,光凭一个英雄是无法逆天的。但是说到大招上面,确实有很多英雄的大招很厉害而且具有一锤定音的效果新型职业病需引起关注目前,中国电子竞技和游戏用户超过5亿,市场规模超过1000亿元,是全球最大的电竞市场。然而,这个新兴行业也存在着许多亟待解决的问题,其中,电竞职业选手的健康问题尤为突出。电竞职业健试玩了几局联盟手游,让我对它的期待又上升了几分虽然说英雄联盟手游国际版已经上线了一段时间,但我也是最近一段时间才正式地试玩过这个游戏,而也就是这一次试玩,让我对这个游戏的期望值又上升了几分。其实这个游戏的玩法和平常我们所玩的m壹号本发布OnexPlayer壹号游戏掌机6月1日发货壹号本今天发布了OnexPlayer壹号游戏掌机,运行Windows10系统,可选搭载英特尔11代酷睿i71185G7i71165G7i51135G7处理器,辅以锐炬核显,8。4英如果DNFampquot惜奶阁ampquot进军超时空,对老板有要求吗?这里我们要先提到一个新的名词,叫做奶金!一般我们当老板,都是把钱给团长,然后自己进图跑图拿个纪录就站街,这样的团我们是叫做金团。但是呢,假如这个团长是个奶妈怎么办呢?奶妈肯定不能自吃鸡5。17迎来约34。4M小更新,哥斯拉的技能被削弱了大家好,欢迎来到刺激实战教室,我是你们的老朋友刺激哥。自从和平精英在海岛地图上线了,各式各样的创意玩法以后,就受到了许多玩家的诟病。细数一下,和平精英大致上线了舞会圣诞祭坛飞艇哥斯寂静岭深层次解析,所谓的邪神是一种怎样的存在寂静岭系列之所以成为经典,是因为有大量的细节铺垫让游戏世界变得和现实世界一样复杂且真实。整个系列中,贯穿始末的主线就是追随者教派(theOrder)试图将他们崇拜的神(theGod
DNF12。16活动汇总!各种奖励抢先看,五个活动可放弃DNF12。16活动汇总!各种奖励抢先看,五个活动可放弃DNF一年一度的嘉年华活动,将重磅起航,为了配合嘉年华活动,策划在12。16版本中,新增了六项活动,秀儿给兄弟们提前爆料奖励复古传奇手游重温当年风味,一代玩家的游戏过程原始传奇这款游戏应该算得上网游界的开山鼻祖。这款网游陪同了多少人,渡过了多少成千上万的夜晚。回想当年拥挤的网络,脏乱的网吧,那照样也有成千上万人纷纷涌入。17级的小法快200的血已剑网三客户端停止更新!玩家这游戏真的凉了?连脸型都下架了剑网三客户端停止更新?这个消息着实让不少玩家都惊讶了。用心做游戏,用脚做优化,机房烤土豆,点卡服有点卡,已经成为了剑三玩家最熟悉的回忆之一。其实剑三也一直在想办法改进一直被大家吐槽英魂之刃新手玩家英雄推荐之战士篇我想大多数玩家还是比较喜欢玩战士的,骁勇善战,英勇无畏,越战越勇。那么我给新手推荐的战士呢也是操作简单,容易上手,带有控制,还有高伤害的英雄!一吕布第一个英雄非吕布莫属,作为三国第中国网游第一人有多猛?2000多万玩家中排第一,年过70还肝游戏?大家好,这里是正惊游戏,我是爱吃瓜的正惊小弟。如果有一天,你顺利地从工作岗位上退休,拥有着大把时间与精力,可以投入到游戏世界里,你又能会玩多久呢?相信屏幕前的某些小伙伴,肯定会不假吕布疑似获得世冠皮肤,虞姬电竞皮肤来袭,纯白花嫁确定返场时间Hello,大家好,这里是兔八哥聊游戏!关注我,为您带来不一样的游戏理解!相信大家对于S26赛季的更新有做过一些了解,同时体验服也在前段时间上线了各种关于S26赛季的新内容,其中就猎人野性的呼唤新手入门教程详解与建议猎人野性的呼唤作为一款狩猎模拟类射击游戏,对于那些喜欢那种在荒野之中狩猎动物感觉的玩家一定是首先之作。在前几天e宝也是送出了这款游戏,所以今天小编带来的就是关于游戏怎么玩的教程,刚游戏被砍全员开香槟庆祝!!!是什么让这家公司被入股86亿?年收入几十亿美元,被腾讯86亿入股,你可能会以为它是个大公司。因为按照大多数人的思路,公司赚钱了,当然是要招更多的人!推出更多的产品!然后赚更多的钱!你错了,Supercell目前Steam年度最受欢迎游戏排名戴森球计划第二,烟火第四IT之家12月15日消息,SteamDB通过自研算法,选出了今年Steam平台的年度最受欢迎游戏排名,好评率评价数玩家人数等因素全部综合考虑。排行榜显示,排名第一的是今年推出正式版盛趣游戏谭雁峰游戏已变成认知世界的新工具游戏与科技的共生发展关系,正成为游戏产业的一个热门话题。12月15日,中国游戏产业年会科技共生分论坛在广州举行,旨在呈现游戏与科技的共生发展关系,展示科技驱动下游戏行业的创新成果,生活在末日之地的怪物,方块方舟主播靠技巧驯服独眼巨人方块方舟是一款恐龙题材的沙盒游戏,在Steam平台受到很多玩家的喜爱。虽说这款游戏采取的是像素画风,但是游戏有着轻快的画面风格活泼的背景音乐,这个世界的环境和生物都塑造都很精致,给