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

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

处暑秋乏至,健康睡中来俗语有曰春困秋乏,处暑时节,天气由热转凉,人的机体同时进入到了一个周期性的休整阶段,身体会有懒洋洋的疲劳感,这叫做秋乏,它是一种自然生理现象。中医学认为秋主燥,耗气伤阴,气虚导致四趋利避害快速拿幻化!新手也能解锁魔兽世界军团外观魔兽世界军团幻化一般是指军团再临资料片中神器的外观,暴雪为全部职业制作了大量精美外观造型,其中不乏一些炫酷指数直逼大气层的,是幻化良品的存在。不过,由于那些好看的外观普遍需求以史为沉迷种田无心战斗,Supercell做了一款零PVP元素的模拟经营游戏近日,Supercell最新产品Everdale在加拿大英国北欧澳大利亚新西兰新加坡中国香港菲律宾和马来西亚等国家或地区开启测试,不需要任何测试资格或激活码,只要符合地区限制所有玩球王会FPX重振LPL荣光,从几点说明,FPX即将获得队史第二冠下面的讨论暂时搁置版本,因为不知道11。19版本对FPX有什么影响,暂时分析FPX夺冠的可能性。1首先,FPX最大的隐患,LWX,恰恰是凌晨战神。比赛在午夜开始的次数越多,状态就越LPL冒泡赛规则,RNG能否二号种子出线?小虎能否成功复仇Faker季后赛正在如火如荼地进行中,别的赛区早早的有出线的队伍,截止至今,LPL没有确定一支队伍前往世界赛。只希望快点结束,给选手们留有更多的时间去备战S11英雄联盟全球总决赛。RNG能不金铲铲之战上线首日,数万玩家排队进场,骑士游侠依旧无解前段时间金铲铲之战开启了小范围内测,但是因为发放名额并不多导致了众多玩家抢不到名额,不过该手游终于在今日正式上线,作为云顶之弈正版手游的金铲铲之战在今天正式上线,前期没有抢到名额的国产惊悚三伏曝角色介绍及故事梗概三伏序章已完成今天国产恐怖惊悚游戏制作人月光蟑螂MR首次公开了新作三伏的角色介绍和游戏梗概,一起来看看吧!徐清源一名道士,受昔日同事沈言川委托调查三眼神童预言事件。邱芜某局调查员,是为刚加入的新EDG31LNG基本锁定世界赛名额在刚刚结束的EDG对LNG的比赛里,EDG31LNG赢得了比赛的胜利。基本上锁定了世界赛的名额,通过目前的比赛来看,木子认为季后赛是凤一其随。FPX稳定冠军以1号种子,EDG2号种微凉的最强对手北慕又回来了,仅用云缨3天时间打到全国23名虽然说微凉已经占据巅峰赛第一名很长时间了,但是就成就而言他还是不如北慕的。最近北慕不仅打上了云缨的国一,而且仅仅使用三天时间就重新达到了全国前23名。而奈白这次又拿到了元歌的国服标王者不用考虑敌方阵容,一楼就可以选的三位英雄,克星少又强势王者峡谷中目前有一百多位英雄,但是他们都存在着某种克制关系,在打排位赛的时候,系统会随机给玩家分配选英雄的顺序,玩家称为一到五楼,但是有些玩家最害怕自己在一楼的位置,因为在选英雄的DNF有哪些装备玩家穿戴很少,但是知名度很高?DNF在国服已经有将近11年的历史了,在这期间出过数以万计的装备,有些装备平淡无奇,有些外观奇葩另类,有些属性非常蛇皮,一般来说那些属性一般的装备都会被玩家所遗忘,但是因为属性奇葩
DYG易峥称AG就是最强的团队,初晨一诺宇宙级双C,夺冠热门KPL常规赛已经进入第三轮,比赛到了关键的阶段,尤其对于S组来说,前四位锁定季后赛胜者组名额。其实经过常规赛这么多场比赛,KPL选手之间对于各个队伍的强度都有较为全面的了解,哪支队不止哥斯拉,和平精英联动哥斯拉大战金刚金刚降临雨林IT之家5月23日消息继哥斯拉入侵海岛后,和平精英昨日与传奇影业怪兽宇宙系列电影作品哥斯拉大战金刚联动继续,金刚降临雨林地图。图源和平精英来到和平精英雨林场景的巨兽金刚,将沿既定路赛尔号官方CP爆料日月双辉,期待进阶!米瑞斯和奇拉美的故事继上篇官方爆料的3位精灵CP,来介绍一下米瑞斯和奇拉美光之子米瑞斯和月之子奇拉美,一个是太阳一个是月亮。当两人同屏出现,浓浓的cp之感就已经扑面而来。游戏中,他们也有过甜蜜的互动。刺激战场绝地海岛图一共有8个防空洞,听说物资都很丰富,都在哪里?有什么战略性意义?刺激战场是一款还原现实的逃杀游戏,游戏中的各种场景都是在现实中都模型的今天我们来聊一聊刺激战场当中的防空洞,总共有8个,地图上面只标记了一个,其余7个你知道在哪吗?先来谈一下防空洞梦幻西游少打几个零?无级别武器在藏宝阁摆666,玩家顺利捡漏如果按照价格的高低给蓝字排名,无级别的名次肯定不低。之所以无级别敢卖那么贵,最主要的原因就是稀少,只有那些狗托玩家才能鉴定出来!随着时间的流逝,无级别装备肯定也会越来越多,问题来了剑灵上线万林峡谷,一起开启梦幻旅程吧五月,虽是初夏,还是很燥热,这样的天气适合在家吹空调吃冰打游戏,人气网游剑灵(5月13日)如期迎来重磅更新,5月版本正式上线。小A今天就带大家一起踏上全新的梦幻旅程吧!这个夏天,可梦幻西游如梦奇谭蜃海影攻略梦幻西游如梦奇谭蜃海影攻略玩法介绍领取条件等级50级,5人组队,且所有队员拥有对应戏票任务领取癫散班主死亡是否有损失是任务时间180分钟领取时间开放期间全天每周次数限制1是否受双倍恭祝RNG喜提亚军DK进决赛国人粉丝狂欢,献计献策狂发RNG弱点恭祝RNG喜提亚军DK进决赛国人粉丝狂欢,献计献策狂发RNG弱点S11的Msi季中赛终于到了最后一天,DK击败MAD之后成功与RNG会师决赛。时隔三年,万众期待的中韩大战终于再次打吕德华15连跪后系统匹配帮忙,结果关键团战手机闪退!华子哽咽了在王者荣耀中,大家都知道如果出现了掉线的情况,也就很难赢了,并且还会被扣信誉积分。而在最近的吕德华的直播的时候,手机在最后的关键团战闪退华子哽咽了,因为这已经是巅峰赛11连跪,排位生化危机8八尺夫人有没有从镜子里看到伊森?玩家她是故意的大家好!我是戒戒,专注于分享游戏心得和趣事的戒戒!生化危机8是卡普空生化危机系列的最新大作,上线短短几天内销量就突破了300W份,而且游戏口碑也是直线上升。游戏内最主要的BOSS就魔兽怀旧服,猎人应该怎么练宝宝技能?谢邀,枫叔以前玩WOW没怎么练猎人,但是朋友有几个猎人,这里给你分享点和他们日常交流时的一些经验。怀旧服里虽然是3个空格,但是要考虑学宝宝技能,很多攻略就教大家怎么抓稀有,抓满了到