RouterFunction的webflux
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相关推荐
- Spring Webflux 响应式编程 (二) - WebFlux编程实战
第一章 Reactive Stream 第1节 jdk9的响应式流 就是reactive stream,也就是flow.其实和jdk8的stream没有一点关系.说白了就一个发布-订阅模式,一共只有4 ...
- 在Spring WebFlux中创建多个RouterFunction
在这篇文章中,我们将研究在Spring WebFlux中为不同的逻辑域定义多个路由器功能. 如果您正在创建"微服务",则可能不会出现问题,因为您很可能仅在每个服务的单个域中工作,但 ...
- Spring Boot 2 快速教程:WebFlux 快速入门(二)
2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘 ...
- 爸爸又给Spring MVC生了个弟弟叫Spring WebFlux
作者:李新杰 来自:编程新说 情景引入 很早之前,Java就火起来了,是因为它善于开发和处理网络方面的应用. Java有一个爱好,就是喜欢制定规范标准,但自己又不善于去实现. 反倒是一些服务提供商使用 ...
- Spring Webflux: Kotlin DSL [片断]
原文链接:https://dzone.com/articles/spring-webflux-kotlin-dsl-snippets 作者:Biju Kunjummen 译者:Jackie Tang ...
- springwebflux 页面_Spring WebFlux 入门
1. WebFlux介绍 Spring WebFlux 是 Spring Framework 5.0中引入的新的响应式web框架.与Spring MVC不同,它不需要Servlet API,是完全异步 ...
- springboot 使用webflux响应式开发教程(一)
什么是webFlux 左侧是传统的基于Servlet的Spring Web MVC框架,右侧是5.0版本新引入的基于Reactive Streams的Spring WebFlux框架,从上到下依次是R ...
- WebFlux02 SpringBoot WebFlux项目骨架搭建
1 环境搭建 1.1 版本说明 jdk -> 1.8 maven -3.5 springboot -> 2.0.3 开发工具 -> IDEA 1.2 创建项目 利用 IDEA 或者 ...
- spring react_使用Spring WebFlux构建React性REST API –第3部分
spring react 在上一篇文章的续篇中,我们将看到一个应用程序以公开React性REST API. 在此应用程序中,我们使用了 带有WebFlux的Spring Boot 具有响应式支持的Ca ...
最新文章
- jquery file upload ajax上传图片 简单使用
- SpringMVC 中整合JSON、XML视图一
- 网络基础知识——以太网
- PIC在线升级源码分析
- 每天一道LeetCode-----从右向左观察一棵二叉树,返回能看到的元素
- 计算机控制cs,计算机控制
- 京东物流将收购德邦股份66.49%股份
- 前魅族科技高级副总裁李楠:iPhone 11的工业设计完全崩盘
- apache开源项目--HttpComponents
- python和uipath区别_Uipath中调用Python的方法
- Failed building wheel for scandir 解决方案
- 怎样定义函数,调用函数
- 01.自定义View(ArcView弧形进度条)
- SpringCloud 微服务 (七) 服务通信 Feign
- linux中安装程序的命令是,Linux安装软件命令是什么
- 局域网ip扫描工具_IP Scanner Pro for mac(局域网IP扫描软件)
- 关于define与defined的区别
- 如何快速定位页面(江湖故人就是个铁憨憨)即时相关性?
- Android常见的问题
- Html与CSS快速入门01-基础概念