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

c -> true 导致异常返回 404 问题排查

最近在新开一个项目,在新建基础架构的时候遇到了一个很有意思的问题:

  • 接口正常访问时返回200
  • Controller 中人为制造异常后
  • 后端日志明确打印了异常
  • 但前端(Apifox)收到的却是404
  • 理论上应该返回500

最终排查发现:

根因是 Spring Boot 全局路径前缀配置污染了系统内置的/error路由。

这个问题非常具有迷惑性,记录一下完整排查过程。

一、问题现象

Controller层制造异常,用于测试异常处理 :

int a = 1 / 0;

二、后端日志

java.lang.ArithmeticException: / by zero

完整调用链中可以看到:

Servlet.service() for servlet [dispatcherServlet] threw exception

说明:

  • Controller 已经执行
  • 异常已经抛出
  • Spring MVC 已经捕获异常

按正常逻辑:

应该返回:

500 Internal Server Error

但实际上:

Apifox 返回:

404 Not Found

三、第一次怀疑方向

一开始怀疑:

1. AOP 吞异常

因为项目里有:

@Around public Object around(ProceedingJoinPoint point)

很多项目会写成:

try { return point.proceed(); } catch (Exception e) { } return null;

这种会导致:

  • Spring 找不到返回视图
  • 最终变成 404

但检查后发现:AOP 没问题

2. 全局异常处理器

怀疑:

@ControllerAdvice

或者:

@ExceptionHandler

吞掉异常

检查后排除

四、真正的问题

项目中有如下配置:

@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void configurePathMatch(PathMatchConfigurer configurer) { // 为所有 Controller 添加 /api 前缀 configurer.addPathPrefix("/api", c -> true); } }

问题就出在:c -> true

五、问题原理分析

这段代码的意思是:

给所有 Controller 都加/api前缀。

注意:

这里的“所有 Controller”不仅仅包括:

  • 自己写的 Controller

还包括:

  • Spring Boot 内置 Controller
  • BasicErrorController
  • /error
  • actuator
  • swagger 等

六、为什么正常接口还能返回 200?

正常情况下请求流程:

DispatcherServlet
-> Controller
-> return AjaxResult.success()
-> 200

因为没有异常:

  • 不会进入/error
  • 所以一切正常

因此返回:200 OK

七、为什么异常时变成 404?

出现异常后,Spring MVC 流程:

DispatcherServlet
-> Controller 抛异常
-> 异常解析器
-> 转发到 /error

正常应该:

/error
-> BasicErrorController
-> 返回 500

但由于:

addPathPrefix("/api", c -> true)

Spring 内置:

/error

也被加了前缀:

/api/error

现在问题就来了:

Spring Boot 默认真正注册的是:/error;不是/api/error
于是异常发生后:

/api/error

找不到。

最终:

404 Not Found

八、问题本质

这里的 404:并不是业务接口不存在;而是异常处理路由不存在

九、最终解决方案

不要给所有 Controller 都加前缀。

应该只给自己的业务 Controller 加。

修改为:

@Configuration
public class WebConfig implements WebMvcConfigurer {

@Override
public void configurePathMatch(PathMatchConfigurer configurer) {

configurer.addPathPrefix(
"/api",
c -> c.getPackageName().startsWith("com.bs.web.controller")
);
}
}

这样:

  • 自己业务 Controller:
/api/xxx
  • Spring 系统 Controller:
/error

不会受影响

总结

c -> true 这种全匹配不要随便使用,Spring Boot 的/error一旦被污染各种诡异问题都会出现

http://www.jsqmd.com/news/779169/

相关文章:

  • 别再只会用积分球测光通量了!手把手教你用便携式LS-ISLS20K校准你的工业相机
  • 【留子必看】2026英文降AI率实操:3招告别Turnitin标蓝,AI率80%降至10% - 殷念写论文
  • 天津救助站哪个靠谱 - GrowthUME
  • AI驱动的联盟营销自动化:从数据决策到闭环增长实战
  • 朱伟领社员进社区,暖阿尔茨海默病患者心 - 博客湾
  • Qt QTreeView实战:用QStandardItemModel构建一个简易文件管理器(附完整源码)
  • LED照明电源设计革新:从降压到升压架构的效率与热管理优化
  • SQL Server如何实现编写表与字段注释_Navicat兼容操作步骤
  • 告别理论!手把手用Verilog/SystemVerilog搭建一个简易的PCIe初始化验证环境
  • 2026品牌定制5大AI数字人直播平台盘点:支持专属虚拟形象搭建
  • 山东商用展示柜厂家|冰怪兽全系网红展示柜定制与批发 - GrowthUME
  • 2025届最火的六大AI论文方案解析与推荐
  • Godot引擎AI智能体集成:MCP协议实现自然语言驱动游戏开发
  • 前端框架演进史:从 jQuery 到 Vue,一场持续十五年的变革
  • Unity AI助手工具链:基于MCP协议实现项目感知与编辑器操作
  • 从IDF 2012看英特尔技术十字路口:Haswell能效革命与Atom移动困局
  • Go语言现代化CLI工具开发:从clawon框架看命令行应用构建
  • kode:harness:统一团队AI编码方向的工程框架
  • 发票识别OCR API接入详解:自动提取发票全字段并接入财务系统(附Python/JS/PHP示例)
  • 下一代物联网基站硬件设计:从异构计算到信号完整性的工程实践
  • 如何进阶使用 Claude Code
  • 裕丰社朱伟携社员乡村行,救心患儿于危难 - 博客湾
  • 如何实现跨平台输入法词库迁移?深蓝词库转换技术架构解析
  • 2026 生物医药融资技术趋势:AI 制药、CGT、ADC 成资本主战场
  • 构建AI Agent技能库:从零到一打造个人与团队的智能体工具箱
  • 高盐废水处理:一项成熟技术解析
  • LLM智能体记忆强化学习方案设计与优化
  • 浏览器自动化技能化实践:从Selenium到模块化流程编排
  • 前端构建工具进化史:从 Grunt / Gulp 到 Webpack 再到 Vite
  • 别再傻傻打全称了!LaTeX/BibTeX用户如何一键搞定IEEE引用格式(含期刊会议缩写库)