Spring Boot全局异常处理器返回400,但被WebFlux客户端调用时Filter仍返回500

Spring Boot全局异常处理器返回400,但被WebFlux客户端调用时Filter仍返回500

1. 系统环境

  • 框架: Spring Boot REST API(基于servlet)。

  • 全局异常处理器:

  • 使用@RestControllerAdvice捕获MyOperationException

  • 返回带有HTTP 400和自定义错误体的ResponseEntity

  • 强制Filter:
  • RuleVerifierFilter(无法修改,来自其他团队)。

  • 用try-catch包裹整个filter chain,任何异常都会设置响应为500。

2. 正常异常处理流程

  • MyService.downloadByKey抛出MyOperationException时,会被全局异常处理器捕获。

  • 处理器会记录异常日志并返回预期的ResponseEntity

  • 对于大多数客户端(如Postman、RestTemplate),表现正常:

  • 客户端收到带有HTTP 400的自定义错误响应。

3. 问题场景

  • 触发条件: 只有当上游团队用WebFlux(reactive)客户端调用API时才会出现。

  • 实际表现:

  • 全局异常处理器返回后,异常依然被RuleVerifierFilter捕获。

  • 客户端收到500错误,而不是预期的400。

  • 响应体内容如下:

{"error": "Request processing failed; nested exception is com.mycompany.myproject.exception.exceptions.MyOperationException"}

  • 连接没有被提前关闭,客户端能收到完整响应体。

4. 日志证据

  • 日志中显示有NestedServletException包裹了MyOperationException

  • 堆栈信息中既有controller也有RuleVerifierFilter

  • 说明异常在处理器之后仍然向上传递,被filter捕获。

5. 已尝试的排查步骤

  • 已确认全局异常处理器被调用并正确构建了响应。

  • 已验证只有WebFlux客户端会复现,其他客户端无法复现。

  • 本地尝试复现未成功。

6. 仍有疑问

  • 为什么异常在被全局异常处理器处理后还会传递到filter?

  • 使用WebFlux(reactive)客户端调用servlet API会导致这种现象吗?

  • 为什么只有WebFlux客户端会出现这个问题?

  • 如何确保异常被处理后不会再向上传递到filter?

  • 还有哪些排查方向或调试建议?

相关推荐
daidaidaiyu8 小时前
Nacos实例一则及其源码环境搭建
java·spring
小江的记录本8 小时前
【Redis】Redis全方位知识体系(附《Redis常用命令速查表(完整版)》)
java·数据库·redis·后端·python·spring·缓存
salipopl10 小时前
Spring 中的 @ExceptionHandler 注解详解与应用
java·后端·spring
Flittly11 小时前
【SpringAIAlibaba新手村系列】(1)初识 Spring AI Alibaba 框架
java·spring
一叶飘零_sweeeet11 小时前
线上故障零扩散:全链路监控、智能告警与应急响应 SOP 完整落地指南
java·后端·spring
NE_STOP12 小时前
Spring Cloud进阶--分布式权限校验OAuth2
spring
RMB Player14 小时前
Spring Boot 集成飞书推送超详细教程:文本消息、签名校验、封装工具类一篇搞定
java·网络·spring boot·后端·spring·飞书
RuoyiOffice14 小时前
企业请假销假系统设计实战:一张表、一套流程、两段生命周期——BPM节点驱动的表单变形术
java·spring·uni-app·vue·产品运营·ruoyi·anti-design-vue
左左右右左右摇晃16 小时前
Java笔记——JMM
java·后端·spring
Schengshuo16 小时前
Spring学习——新建module模块
java·学习·spring