【WebFlux】第四篇 —— 响应式异常处理与测试
告别 try-catch响应式异常处理机制在传统的同步编程中我们习惯用 try-catch 来捕获异常。但在响应式编程中由于代码是声明式的、异步执行的当异常在 map 或 flatMap 内部抛出时它不会中断当前线程而是作为一个“错误信号onError”沿着数据流向下游传播。如果这个信号没有被处理最终会导致整个订阅被终止。Reactor 提供了一套强大的操作符来优雅地处理这些错误onErrorReturn优雅降级当发生异常时直接返回一个默认的兜底值保证流不会中断。Flux.just(1,2,0,4).map(i-10/i)// 遇到 0 时会抛出 ArithmeticException.onErrorReturn(-1)// 捕获异常返回默认值 -1.subscribe(System.out::println);// 输出: 10, 5, -1onErrorResume切换备用流当发生异常时根据异常类型切换到另一个备用的 Publisher数据流。这在处理外部服务调用失败时非常有用。fetchFromPrimaryService().onErrorResume(TimeoutException.class,e-fetchFromBackupService())// 主服务超时自动切换备用服务.subscribe(System.out::println);onErrorMap异常转换将底层的异常如数据库报错转换为业务层更容易理解的自定义异常。userRepository.findById(id).onErrorMap(DataAccessException.class,e-newBusinessException(用户数据获取失败)).subscribe();全局异常拦截ControllerAdvice 的响应式改造除了流级别的处理Spring WebFlux 依然支持我们熟悉的 ControllerAdvice 进行全局异常拦截。需要注意的是在 WebFlux 中处理方法的返回值应该是响应式的 Mono。ControllerAdvicepublicclassGlobalExceptionHandler{ExceptionHandler(BusinessException.class)publicMonoResponseEntityErrorResponsehandleBusinessException(BusinessExceptionex){ErrorResponseerrornewErrorResponse(HttpStatus.BAD_REQUEST.value(),ex.getMessage());returnMono.just(ResponseEntity.status(HttpStatus.BAD_REQUEST).body(error));}}响应式自动化测试利器WebTestClient在 Spring WebFlux 中传统的 MockMvc 无法处理异步流因此官方提供了 WebTestClient。它基于 WebClient 构建专门用于对 WebFlux 端点进行非阻塞的断言测试。实战示例使用 WebFluxTest 进行控制器测试WebFluxTest(UserController.class)// 仅加载 WebFlux 相关的上下文启动极快classUserControllerTest{AutowiredprivateWebTestClientwebTestClient;MockBeanprivateUserServiceuserService;// 模拟 Service 层依赖TestvoidshouldReturnUserWhenExists(){// 1. 定义 Mock 行为Mockito.when(userService.findById(1)).thenReturn(Mono.just(newUser(1,Alice)));// 2. 发起请求并断言webTestClient.get().uri(/api/users/1).exchange()// 执行请求.expectStatus().isOk()// 断言 HTTP 状态码为 200.expectBody()// 断言响应体内容.jsonPath($.name).isEqualTo(Alice);}}响应式流的单元测试StepVerifier如果要测试 Service 层返回的 Flux 或 MonoWebTestClient 就不适用了。此时我们需要引入 reactor-test 依赖并使用 StepVerifier。它是验证异步序列的绝对利器。实战示例验证 Flux 流的行为TestvoidtestUserStream(){FluxStringuserStreamuserService.getActiveUsers();StepVerifier.create(userStream).expectNext(Alice)// 期望第一个元素是 Alice.expectNextMatches(name-name.startsWith(B))// 期望第二个元素以 B 开头.expectNextCount(3)// 期望接下来还有 3 个元素.expectComplete()// 期望流正常结束.verify(Duration.ofSeconds(5));// 设置超时时间防止流卡死}本篇小结响应式编程中的异常处理分为“流级别的操作符降级”和“全局级别的统一拦截”。而在测试方面WebTestClient 和 StepVerifier 是验证响应式逻辑正确性的左膀右臂。下一步预告至此我们已经掌握了 Reactor 的核心语法。下一篇笔记我们将正式回到 Spring WebFlux 框架对比“基于注解的 Controller”与“函数式端点Router Functions”两种编程模型并学习如何使用 WebClient 发起非阻塞的外部 HTTP 调用。准备好进入真正的 Web 开发了吗

相关新闻

git-pr-release与GitHub Actions集成:自动化CI/CD发布流程的终极指南

git-pr-release与GitHub Actions集成:自动化CI/CD发布流程的终极指南

git-pr-release与GitHub Actions集成:自动化CI/CD发布流程的终极指南 【免费下载链接】git-pr-release Release pull request generator 项目地址: https://gitcode.com/gh_mirrors/gi/git-pr-release 想要实现GitHub项目的自动化发布流程?git-pr…

2026/8/21 1:31:34 阅读更多 →
HardFault:程序跑飞后的“最后一声惨叫”

HardFault:程序跑飞后的“最后一声惨叫”

短文标题:HardFault:程序跑飞后的“最后一声惨叫”【传播知识手有余香🌹】转发此文到朋友圈赠送于振南老师知识视频合集哦!你有没有遇到过这种情况:程序跑着跑着,突然死了。不是死机,是进了Hard…

2026/8/21 4:26:54 阅读更多 →
通义千问大语言模型技术解析与企业级部署实践指南

通义千问大语言模型技术解析与企业级部署实践指南

通义千问大语言模型技术解析与企业级部署实践指南 【免费下载链接】Qwen The official repo of Qwen (通义千问) chat & pretrained large language model proposed by Alibaba Cloud. 项目地址: https://gitcode.com/GitHub_Trending/qw/Qwen 通义千问(…

2026/8/18 13:02:59 阅读更多 →

最新新闻

CLAG框架:为SLM智能体构建自适应记忆管理系统

CLAG框架:为SLM智能体构建自适应记忆管理系统

1. 从“记忆混乱”到“智能归档”:为什么SLM需要CLAG?如果你最近在折腾那些参数规模在70亿到130亿之间的小语言模型,想把它们打造成能独立完成复杂任务的智能体,那你大概率会遇到一个头疼的问题:记忆管理。这听起来有点…

2026/8/21 9:44:24 阅读更多 →
深度解析 RocketMQ 消费起点:ConsumeFromWhere 底层加载机制与失效陷阱

深度解析 RocketMQ 消费起点:ConsumeFromWhere 底层加载机制与失效陷阱

文章目录🧭 深度解析 RocketMQ 消费起点:ConsumeFromWhere 底层加载机制与失效陷阱📑 文章摘要🌳 核心基础:底层结构与物理模型🧩 1. OffsetStore 与消费进度的管理模型📐 2. 核心枚举值的物理对…

2026/8/21 9:44:24 阅读更多 →
C++面向对象编程:Point、Line、Rectangle、Circle类设计与实现

C++面向对象编程:Point、Line、Rectangle、Circle类设计与实现

1. 引言在C面向对象编程中,类的设计是核心基础。本文将通过一个完整的示例,展示如何设计Point(点)、Line(线段)、Rectangle(长方形)和Circle(圆)四个类&#…

2026/8/21 9:44:24 阅读更多 →
大模型 API 的范式转移:从 Chat Completions 到 Responses API

大模型 API 的范式转移:从 Chat Completions 到 Responses API

引言 2025 年 3 月,OpenAI 正式推出 Responses API。一年后的今天,它已成为构建 AI Agent 的首选接口。2026 年 3 月,OpenAI 进一步扩展了 Responses API,加入 Shell 工具和托管容器工作空间。与此同时,Assistants API…

2026/8/21 9:44:24 阅读更多 →
为AI智能体注入人格与情绪:提升多智能体协作效率的工程实践

为AI智能体注入人格与情绪:提升多智能体协作效率的工程实践

1. 从代码到“同事”:当AI智能体开始拥有个性与情绪 最近在折腾一个多智能体协作的软件项目,遇到了一个挺有意思的瓶颈。我们团队设计了一个由多个LLM驱动的智能体(Agents)组成的“虚拟软件团队”,分工明确&#xff1a…

2026/8/21 9:43:24 阅读更多 →
物理世界模型CurrentWorld-0:从多模态感知到物理常识推理的范式转移

物理世界模型CurrentWorld-0:从多模态感知到物理常识推理的范式转移

上周,一个朋友发来一条消息,问我有没有关注一个叫“CurrentWorld-0”的新模型。他说,这玩意儿号称是“全球首个跨本体、跨视角、多模态物理世界模型”,听起来很唬人,但点进去一看,全是“跨模态对齐”、“统…

2026/8/21 9:43:24 阅读更多 →

日新闻

机场边检旅客定位系统国产化白皮书:算法、硬件、底座平台全程自主

机场边检旅客定位系统国产化白皮书:算法、硬件、底座平台全程自主

前言随着国家数字基础设施信创替代、关键技术自主可控战略持续深化,口岸智慧安防、边检智能管控领域正全面进入国产化、自主化、安全可控升级周期。当前国内机场边检旅客识别与定位体系长期依赖国外商用视觉算法、进口成像硬件、闭源通用计算平台,存在核…

2026/8/21 0:00:42 阅读更多 →
别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱

别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱

别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱当下数字化建设浪潮中,很多项目将三维可视化、视频贴图叠加的数字孪生等同于空间智能。传统数字孪生更多停留在三维场景复刻,擅长把物理世界“画出来、展示出来”,…

2026/8/21 0:00:42 阅读更多 →
105、车载温度范围-40°C到85°C的影像质量一致性——ISP参数温漂补偿与产线标定策略

105、车载温度范围-40°C到85°C的影像质量一致性——ISP参数温漂补偿与产线标定策略

105、车载温度范围-40C到85C的影像质量一致性——ISP参数温漂补偿与产线标定策略 去年冬天在北方某车厂做A样评审,凌晨四点的黑河试验场,零下三十三度。客户拿了一台冷启动的车,中控屏上倒车影像全是雪花噪点,暗部细节直接糊成一片。我第一反应是sensor温度没上来,暗电流…

2026/8/21 0:00:42 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/21 3:21:33 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/21 0:02:09 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/21 6:07:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/20 6:11:08 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/20 21:46:49 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/21 0:14:22 阅读更多 →