当前位置: 首页 > news >正文

java webflux函数式实现数据结构

我前面写的文章
java webflux注解方式写一个可供web端访问的数据接口
带大家写了个注解方式实现的webflux

首先 使用函数式时 您需要自己初始化服务器
使用函数式需要两个接口 分别是 RouterFunction 和 HandlerFuncion
RouterFunction主要的作用就是分别一下任务 例如 添加 直接被指派给添加的任务 将任务交到对应的函数上
HandlerFuncion 这是处理请求操作的具体部分 简单说 就是执行你请求具体要做的内容

SpringWebflux请求和响应不再是ServletRequest和ServletResponse ,而是ServerRequest 和 ServerResponse 这两个主要是为了提供非阻塞异步支持的方法

话不多说 上代码
先创建一个 Spring initiolar 项目

然后 找到项目配置文件 pom.xml
引入webflux 和 web
参考代码如下

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

在这里插入图片描述
然后 打开项目如下图箭头所指的这个目录
在这里插入图片描述
在项目创建我们项目所需要的结构包 entity,hondler,senvice
然后 我们的项目就是这样的
在这里插入图片描述
在entity包下创建一个类 叫 User 参考代码如下

package com.example.springapiweb.entity;public class User {private String name;private String gender;private Integer age;public User(String name,String gender,Integer age){this.name = name;this.gender = gender;this.age = age;}public void setName(String name){this.name = name;};public void setGender(String gender) {this.gender = gender;}public void setAge(Integer age) {this.age = age;}public String getName(){return this.name;};public String getGender() {return this.gender;}public Integer getAge() {return this.age;}
}

简单创建了一个实体类 创建了三个字段 name 用户名称 gender 性别 age 年龄 写了他们对应的get set 和 一个有参构造方法

然后呢 我们这个项目就不直接去操作数据库啦

我们在 senvice 包下创建一个接口 叫 UserService
参考代码如下

package com.example.springapiweb.senvice;import com.example.springapiweb.entity.User;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;public interface UserService {//根据id查询用户Mono<User> getUserById(int id);//查询所有用户Flux<User> getAllUser();//添加用户Mono<Void> saveUserInfo (Mono<User> user);
}

我们在接口中定义了几个比较简单的用户操作方法

然后在 senvice 下创建一个包 叫 impl 用于存放实现类 在下面创建一个类 叫 UserServiceImpl

参考代码如下

package com.example.springapiweb.senvice.impl;import com.example.springapiweb.entity.User;
import com.example.springapiweb.senvice.UserService;
import org.springframework.stereotype.Repository;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;import java.util.Map;
import java.util.HashMap;@Repository
public class UserServiceImpl implements UserService {//创建map集合存储教据private final Map<Integer,User> users = new HashMap<>();//在构造方法中为map注入几条数据public UserServiceImpl(){this.users.put(1,new User("小猫猫","女",2));this.users.put(2,new User("小明","男",11));this.users.put(3,new User("服部半藏","男",32));}//根据id查询指定用户@Overridepublic Mono<User> getUserById(int id) {return Mono.justOrEmpty(this. users. get (id));}//查询所有用户@Overridepublic Flux<User> getAllUser() {return Flux.fromIterable(this.users.values());}//添加用户@Overridepublic Mono<Void> saveUserInfo(Mono<User> userMono) {return userMono.doOnNext(person -> {//向map集合里面放值int id = users. size()+1;users.put(id,person);}).thenEmpty(Mono.empty());}
}

然后在hondler下创建一个类 叫 UserHandler
参考代码如下

package com.example.springapiweb.hondler;import com.example.springapiweb.entity.User;
import com.example.springapiweb.senvice.UserService;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;import static org.springframework.web.reactive.function.BodyInserters.fromObject;public class UserHandler {private final UserService userService;public UserHandler(UserService userService) {this.userService = userService;}//根据id查询用户public Mono<ServerResponse> getUserById(ServerRequest request){int userid = Integer.valueOf(request.pathVariable("id"));Mono<User> userMono = this.userService.getUserById(userid);return userMono.flatMap(person -> ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).body(fromObject(person)));}//查询所有用户public Mono<ServerResponse> getAllUsers (ServerRequest request) {Flux<User> users = this. userService.getAllUser();return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).body(users,User.class);}//添加用户public Mono<ServerResponse> saveUser(ServerRequest request) {Mono<User> userMono = request.bodyToMono(User.class);return ServerResponse.ok().build(this.userService.saveUserInfo(userMono));}}

ServerRequest 是一个函数式请求对象 从里面可以调用pathVariable 拿到请求路径上的参数 这里 我们拿一个叫id的参数 然后调用userService中的getUserById 拿到一个user类的对象 通过id取回来的 然后通过步骤 转为json

那么 这样 整体的一个结构我们就搭好了

下面 我们要通过 RouterFunction 做路由 来进行一个调用

然后在src下创建一个类 叫 Server 参考代码如下

package com.example.springapiweb;import com.example.springapiweb.hondler.UserHandler;
import com.example.springapiweb.senvice.UserService;
import com.example.springapiweb.senvice.impl.UserServiceImpl;
import org.springframework.http.server.reactive.HttpHandler;
import org.springframework.http.server.reactive.ReactorHttpHandlerAdapter;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.netty.http.server.HttpServer;import java.io.IOException;import static org.springframework.http.MediaType.APPLICATION_JSON;
import static org.springframework.web.reactive.function.server.RequestPredicates.GET;
import static org.springframework.web.reactive.function.server.RequestPredicates.accept;
import static org.springframework.web.reactive.function.server.RouterFunctions.toHttpHandler;public class Server {public static void main(String[] args) throws IOException {Server server = new Server();server.createReactorServer();System.out.println("enter to exit");System.in.read();}//1创建Router路由public RouterFunction<ServerResponse> routingFunction() {UserService userService = new UserServiceImpl();UserHandler handler = new UserHandler(userService);return RouterFunctions.route(GET("/users/{id}").and(accept(APPLICATION_JSON)),handler::getUserById).andRoute(GET( "/users").and(accept(APPLICATION_JSON)),handler::getAllUsers);}public void createReactorServer() {RouterFunction<ServerResponse> route = routingFunction();HttpHandler httpHandler = toHttpHandler(route);ReactorHttpHandlerAdapter adapter = new ReactorHttpHandlerAdapter(httpHandler);HttpServer httpServer = HttpServer. create();httpServer.handle(adapter).bindNow();}
}

我们这个要靠main执行 在main上右键 选择启动
在这里插入图片描述
然后项目就起来了 我们拿到系统给的端口
在这里插入图片描述

直接访问 http://localhost:端口/users/1
例如我这里 运行结果如下
在这里插入图片描述
这里 我们访问的就是 id为1的用户啦
然后 我们试所有用户
在这里插入图片描述
也没有任何问题

相关文章:

java webflux函数式实现数据结构

我前面写的文章 java webflux注解方式写一个可供web端访问的数据接口 带大家写了个注解方式实现的webflux 首先 使用函数式时 您需要自己初始化服务器 使用函数式需要两个接口 分别是 RouterFunction 和 HandlerFuncion RouterFunction主要的作用就是分别一下任务 例如 添加 直…...

百度文心一言可以完胜ChatGPT的4点可能性

文心一言&#xff0c;百度全新一代知识增强大语言模型&#xff0c;文心大模型家族的新成员&#xff0c;能够与人对话互动&#xff0c;回答问题&#xff0c;协助创作&#xff0c;高效便捷地帮助人们获取信息、知识和灵感。但说实话&#xff0c;很多人拿他与ChatGPT相对比&#x…...

大型分布式架构设计

大型网站的特点 大型网站架构技术 大型网站架构技术-架构模式 大型网站架构技术-高性能架构 以用户为中心&#xff0c;提供快速的访问体验。主要体现在&#xff1a;响应快、并发能力高和性能稳定。 大型网站架构技术-高可用架构 大型网站在任何时候都应该可以正常访问&#…...

基于springboot实现校园在线拍卖电商系统【源码】

基于springboot实现校园在线拍卖系统演示开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&…...

SaaS智慧校园源码,电子班牌管理系统 人脸考勤、综合评价系统、请假管理、校务管理

Java智慧校园系统源码 智慧学校源码 小程序电子班牌&#xff0c;前后端分离架构 智慧校园全套源码包含&#xff1a;电子班牌管理系统、成绩管理系统、考勤人脸刷卡管理系统、综合素养评价系统、请假管理系统、电子班牌发布系统、校务管理系统、小程序移动端、教师后台管理系统…...

MONGODB mongodb 一般人不知道的数据类型与使用

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…...

蚁群算法优化

%%%%%%%%%%%%蚁群算法解决 TSP 问题%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%% clear all; %清除所有变量 close all; %清图 clc; %清屏 m 50; %蚂蚁个数 Alpha 1; %信息素重要程度参数 Beta 5; %启发式因子重要程度参数 Rho 0.1; %信息素蒸发系数 G 20…...

山东首版次申报的材料

首版次软件基本知识: 1、 首版次高端软件的定义: 首版次高端软件是指省内企事业单位通过自主开发或者合作开发其功能或性能有重大突破 在该领域具有技术领先优势或者打破市场垄断拥有自主知识产权 尚未取得重大市场业绩的 同产品名称、同一版本号的软件产品。 2、主管部门:山…...

个人时间管理网站—首页的前端实现【源码】

&#x1f31f;所属专栏&#xff1a;献给榕榕 &#x1f414;作者简介&#xff1a;rchjr——五带信管菜只因一枚 &#x1f62e;前言&#xff1a;该专栏系为女友准备的&#xff0c;里面会不定时发一些讨好她的技术作品&#xff0c;感兴趣的小伙伴可以关注一下~&#x1f449;文章简…...

Python毕业设计推荐

今天给大家推荐4个基于python的毕业设计/课程设计 1 网上商城系统 这是一个基于pythonvue开发的商城网站&#xff0c;平台采用B/S结构&#xff0c;后端采用主流的Python语言进行开发&#xff0c;前端采用主流的Vue.js进行开发。 整个平台包括前台和后台两个部分。 前台功能…...

使用nodemon时报错:“无法加载文件...,因为在此系统上禁止运行脚本“;windows执行策略修改

报错内容如下图&#xff1a; Windows 系统会对全局安装的脚本进行一个限制&#xff0c;防止恶意脚本执行&#xff0c;所以此处会报错。 如何解决&#xff1f;通过修改 windows 执行策略来解决此问题。 一、什么是 windows 执行策略 Windows 给 PowerShell 设定了一个叫 “…...

网络协议分析期末复习(五)

目录 0.前言 1.PC和PPPOE服务器建立连接的流程以及包含LCP配置选项的PPP帧 -Discovery阶段 -Session阶段 -Terminate阶段 包含LCP配置选项的PPP帧如下 2.ARP的步骤以及过程中的具体ARP报文 Step1&#xff1a;查看路由表项以及本地的ARP缓存表 Step2&#xff1a;发送ARP…...

外贸找客户软件:Yellow Page Spider 8.7.1 Crack

黄页蜘蛛 |黄页提取器 从PAGINE GIALLE中提取数据&#xff0c;电子邮件&#xff0c;公司&#xff0c;协会&#xff0c;商业活动的电话&#xff01; Yellow Page Spider 8.7.1对于那些在附近或任何意大利地点寻找商业活动、公司、协会、各种俱乐部的人来说&#xff0c;PagineGia…...

博客管理系统(前端页面设计)

文章目录一、预期效果二、博客列表页三、博客详情页四、博客登录页五、博客编辑页一、预期效果 博客登录页&#xff1a; 博客列表页&#xff1a; 博客详情页&#xff1a; 博客编辑页&#xff1a; 目录结构&#xff1a; 大家需要注意&#xff0c;我们下述代码的所有路径都…...

安装yolov5环境

当今世界上&#xff0c;深度学习技术在各个领域都有广泛的应用&#xff0c;因此掌握深度学习技术对于从事人工智能相关工作的人来说是非常重要的。而 YOLOv5 是一个非常流行的目标检测框架&#xff0c;本文将介绍如何在 Ubuntu 系统上安装 YOLOv5 环境。 1.安装 Anaconda Ana…...

IP 归属地查询 API 教你从0到1顺着网线找到键盘侠

写在前面 前一段时间&#xff0c;微博、头条、抖音、知乎等各大互联网平台相继推出了“个人主页、评论显示 IP 属地&#xff0c;用户不能自己开启或关闭”的功能&#xff0c;那么这些平台是如何获取到用户的 IP 地址呢&#xff1f; 本文将从 IP 归属地的技术原理、实际应用场…...

【K8S系列】深入解析Pod对象(二)

目录 序言 1.Volume 简单介绍 2 Projected Volume 介绍 2.1 Secret 2.1.1 yaml讲解 2.1.2 创建Pod 2.2 Downward API 2.2.1 yaml示例 2.2.2 Downward API 支持字段 3 投票 序言 任何一件事情&#xff0c;只要坚持六个月以上&#xff0c;你都可以看到质的飞跃。 在…...

从3千到3万,我的测试之路真的坎坷

其实测试行业未来发展之路是几乎所有关于软件测试工程师都会在意的话题&#xff0c;相信各位看官也很迷茫自己的发展路线。为了方便大家选择和比较&#xff0c;我也将我的经验和观点分享出来&#xff0c;以作参考。如果小伙伴们有更好的观点&#xff0c;欢迎分享和探讨&#xf…...

linux下使用system函数在程序中运行linux的shell命令

一、功能 linux下在程序中调用shell命令实现某个功能&#xff0c;比如拷贝命令cp 二、使用 添加头文件 #include <stdlib.h> 函数原型 int system(const char *command); 描述说明是system的调用过程&#xff1a; 使用fork创建一个子进程&#xff0c;子进程使用 execl 执…...

银行数字化转型导师坚鹏:银行业发展趋势及对人才的需求分析

数字化转型背景下银行业发展趋势及对人才的需求分析 ——洞察先机&#xff0c;重塑人才核心竞争力 课程背景&#xff1a; 数字化转型背景下&#xff0c;很多银行存在以下问题&#xff1a;不知道银行整体发展现状与发展趋势&#xff1f;不清楚金融科技对银行发展有什么影响&…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...