RouterFunction可以运行在servlet或netty上,所以我们需要将两个容器间的不同点抽象出来。

整个开发过程有几步:

1.HandleFunction,实现输入ServerRequest,输出ServerResponse

2.RouterFunction,把请求url和HandlerFunction对应起来

3.把RouterFunction包装成HttpHandler,交给容器Server处理。

代码:

实体类和仓库不变

handler:

@Component
public class UserHandler {private final UserRepository repository;public UserHandler(UserRepository repository) {this.repository = repository;}public Mono<ServerResponse> getAllUser(ServerRequest request){return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).body(repository.findAll() , User.class);}public Mono<ServerResponse> createUser(ServerRequest request){Mono<User> userMono = request.bodyToMono(User.class);return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).body(repository.saveAll(userMono) , User.class);}public Mono<ServerResponse> deleteUserById(ServerRequest request){String id = request.pathVariable("id");return this.repository.findById(id).flatMap(user -> this.repository.delete(user).then(ServerResponse.ok().build())).switchIfEmpty(ServerResponse.notFound().build());}
}

router:

@Configuration
public class AllRouters {@BeanRouterFunction<ServerResponse> userRouter(UserHandler handler){return RouterFunctions.nest(//相当于requestMappingRequestPredicates.path("/user") ,RouterFunctions.route(RequestPredicates.GET("/") , handler::getAllUser).andRoute(RequestPredicates.POST("/").and(RequestPredicates.accept(MediaType.APPLICATION_JSON)) , handler::createUser).andRoute(RequestPredicates.DELETE("/{id}") , handler::deleteUserById));}
}

接下来看看routerFunction下的参数校验:

改造下代码(这里只写一个做例子)

public Mono<ServerResponse> createUser(ServerRequest request){Mono<User> userMono = request.bodyToMono(User.class);return userMono.flatMap(user -> {//在这里做校验//xxxreturn ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).body(repository.saveAll(userMono) , User.class);});}

异常捕获,用aop的方式:

@Component
@Order(-99)
public class ExceptionHandler implements WebExceptionHandler {@Overridepublic Mono<Void> handle(ServerWebExchange serverWebExchange, Throwable throwable) {ServerHttpResponse response = serverWebExchange.getResponse();response.setStatusCode(HttpStatus.BAD_REQUEST);response.getHeaders().setContentType(MediaType.TEXT_PLAIN);String errorMsg = toStr(throwable);DataBuffer db = response.bufferFactory().wrap(errorMsg.getBytes());return response.writeWith(Mono.just(db));}private String toStr(Throwable throwable) {//已知异常,自定义异常,这里懒得写了,就随便找一个代替if (throwable instanceof NumberFormatException){NumberFormatException e = (NumberFormatException) throwable;return e.getMessage();}//未知异常else {throwable.printStackTrace();return throwable.toString();}}
}

RouterFunction的webflux相关推荐

  1. Spring Webflux 响应式编程 (二) - WebFlux编程实战

    第一章 Reactive Stream 第1节 jdk9的响应式流 就是reactive stream,也就是flow.其实和jdk8的stream没有一点关系.说白了就一个发布-订阅模式,一共只有4 ...

  2. 在Spring WebFlux中创建多个RouterFunction

    在这篇文章中,我们将研究在Spring WebFlux中为不同的逻辑域定义多个路由器功能. 如果您正在创建"微服务",则可能不会出现问题,因为您很可能仅在每个服务的单个域中工作,但 ...

  3. Spring Boot 2 快速教程:WebFlux 快速入门(二)

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘 ...

  4. 爸爸又给Spring MVC生了个弟弟叫Spring WebFlux

    作者:李新杰 来自:编程新说 情景引入 很早之前,Java就火起来了,是因为它善于开发和处理网络方面的应用. Java有一个爱好,就是喜欢制定规范标准,但自己又不善于去实现. 反倒是一些服务提供商使用 ...

  5. Spring Webflux: Kotlin DSL [片断]

    原文链接:https://dzone.com/articles/spring-webflux-kotlin-dsl-snippets 作者:Biju Kunjummen 译者:Jackie Tang ...

  6. springwebflux 页面_Spring WebFlux 入门

    1. WebFlux介绍 Spring WebFlux 是 Spring Framework 5.0中引入的新的响应式web框架.与Spring MVC不同,它不需要Servlet API,是完全异步 ...

  7. springboot 使用webflux响应式开发教程(一)

    什么是webFlux 左侧是传统的基于Servlet的Spring Web MVC框架,右侧是5.0版本新引入的基于Reactive Streams的Spring WebFlux框架,从上到下依次是R ...

  8. WebFlux02 SpringBoot WebFlux项目骨架搭建

    1 环境搭建 1.1 版本说明 jdk -> 1.8 maven -3.5 springboot -> 2.0.3 开发工具 -> IDEA 1.2 创建项目 利用 IDEA 或者 ...

  9. spring react_使用Spring WebFlux构建React性REST API –第3部分

    spring react 在上一篇文章的续篇中,我们将看到一个应用程序以公开React性REST API. 在此应用程序中,我们使用了 带有WebFlux的Spring Boot 具有响应式支持的Ca ...

最新文章

  1. jquery file upload ajax上传图片 简单使用
  2. SpringMVC 中整合JSON、XML视图一
  3. 网络基础知识——以太网
  4. PIC在线升级源码分析
  5. 每天一道LeetCode-----从右向左观察一棵二叉树,返回能看到的元素
  6. 计算机控制cs,计算机控制
  7. 京东物流将收购德邦股份66.49%股份
  8. 前魅族科技高级副总裁李楠:iPhone 11的工业设计完全崩盘
  9. apache开源项目--HttpComponents
  10. python和uipath区别_Uipath中调用Python的方法
  11. Failed building wheel for scandir 解决方案
  12. 怎样定义函数,调用函数
  13. 01.自定义View(ArcView弧形进度条)
  14. SpringCloud 微服务 (七) 服务通信 Feign
  15. linux中安装程序的命令是,Linux安装软件命令是什么
  16. 局域网ip扫描工具_IP Scanner Pro for mac(局域网IP扫描软件)
  17. 关于define与defined的区别
  18. 如何快速定位页面(江湖故人就是个铁憨憨)即时相关性?
  19. Android常见的问题
  20. Html与CSS快速入门01-基础概念

热门文章

  1. Google“员工”大曝内幕(精彩)
  2. 精诚CRM系统如何预防客户流失,提升客户留存
  3. 旧貌换新颜,捷径系统助力老旧小区向智能化迈进
  4. html里换行用什么标签,html换行标签是什么?
  5. android动态设置软键盘弹出模式,Android 弹出软键盘所遇到的坑及解决方法
  6. 前端自动化测试框架cypress(一)
  7. 电商项目介绍面试的时候会问到
  8. 动态规划总结三01背包问题
  9. vue花括号和php冲突,vue的花括号怎么使用
  10. cf922D(贪心)