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?

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

相关推荐
鸽鸽程序猿2 小时前
【项目】基于Spring全家桶的论坛系统 【下】
后端·spring·restful
Lisonseekpan2 小时前
Spring Boot 中使用 Caffeine 缓存详解与案例
java·spring boot·后端·spring·缓存
小许学java2 小时前
Spring AI快速入门以及项目的创建
java·开发语言·人工智能·后端·spring·ai编程·spring ai
kfepiza4 小时前
Spring 如何解决循环依赖 笔记251008
java·spring boot·spring
kfepiza6 小时前
Spring的三级缓存原理 笔记251008
笔记·spring·缓存
popoxf15 小时前
spring容器启动流程(反射视角)
java·后端·spring
谷哥的小弟16 小时前
Spring Framework源码解析——ApplicationContextAware
spring·源码
武子康17 小时前
Java-141 深入浅出 MySQL Spring事务失效的常见场景与解决方案详解(3)
java·数据库·mysql·spring·性能优化·系统架构·事务
珹洺17 小时前
Java-Spring入门指南(十五)SpringMVC注解开发
java·spring·microsoft
半旧夜夏18 小时前
【Spring】AOP的核心原理配方
java·spring