spring boot 全局异常处理可自动适配 html 与 json:通过 accept 请求头由 basicerrorcontroller 路由,自定义 error 页面放 templates/error/ 下,rest 异常用 @restcontrolleradvice 统一返回 json,也可继承 defaulterrorattributes 增强 /error 的 json 数据。

Spring Boot 全局异常处理要同时支持 HTML 页面和 JSON 报文,关键在于区分请求来源(浏览器 or API 客户端)并按需响应。默认机制已具备这种能力,只需合理定制即可,无需重复造轮子。
利用 Accept 请求头自动适配格式
Spring Boot 的 BasicErrorController 默认就根据请求头 Accept 的值做路由:
- 当
Accept: text/html(浏览器典型行为),返回 HTML 错误视图(如error/404.html或error/5xx.html) - 当
Accept: application/json(Postman、前端 fetch/Axios 默认或显式设置),返回结构化 JSON(含 timestamp、status、path 等)
你不需要在异常处理器里手动判断,只要不覆盖 /error 映射,这个自动适配就一直生效。
自定义 HTML 错误页面(模板引擎场景)
使用 Thymeleaf、Freemarker 等模板引擎时,把页面放在 src/main/resources/templates/error/ 目录下:
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
-
error/404.html→ 专用于 404 -
error/500.html→ 专用于 500 -
error/5xx.html→ 匹配所有 5xx 状态码(兜底) -
error/4xx.html→ 匹配所有 4xx 状态码 -
error.html→ 最终兜底页(无更精确匹配时使用)
页面中可直接用 Thymeleaf 表达式访问错误数据:${status}、${error}、${message}、${path}、${timestamp}。
统一返回 JSON 的业务异常(@ControllerAdvice + @ResponseBody)
对 REST 接口,推荐用 @RestControllerAdvice 捕获自定义异常,并直接返回 JSON:
- 定义业务异常类,如
BizException,不带@ResponseStatus - 在
@ExceptionHandler方法上加@ResponseBody(或直接用@RestControllerAdvice) - 方法返回统一结构体(如
Result<void>.fail("库存不足")</void>),Spring 自动序列化为 JSON - 该方式会绕过
/error,所以不参与 BasicErrorController 的内容协商,但更可控、更符合 API 规范
保留 /error 路由并增强 JSON 数据(继承 DefaultErrorAttributes)
若想让所有异常(包括未被捕获的)最终都走 /error,又希望 JSON 中包含自定义字段(如 code、requestId),可扩展 ErrorAttributes:
- 继承
DefaultErrorAttributes,重写getErrorAttributes() - 在返回的 Map 中 put 额外字段,例如:
attributes.put("code", "SYS_ERROR") - 将该 Bean 注册进容器,它会自动被
BasicErrorController使用 - 这样无论浏览器还是 API 请求,都能拿到增强后的错误信息(HTML 页面里也能用
${code})
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










