spring boot 中可通过 @controlleradvice 与 @exceptionhandler 实现全局异常处理并返回自定义 html 错误页,需配置 thymeleaf 视图解析器、创建 error.html 页面、定义 businessexception 异常类,并在处理器中传入错误信息供模板渲染。

Spring Boot 中可以通过 @ControllerAdvice 配合 @ExceptionHandler 实现全局异常处理,并返回自定义的错误提示页面(如 HTML 页面),而不是默认的 JSON 错误响应或白页。
配置视图解析器支持 HTML 返回
确保项目已引入 Thymeleaf(或其他模板引擎),并在 application.properties 中启用视图解析:
spring.thymeleaf.enabled=true spring.thymeleaf.cache=false spring.thymeleaf.prefix=classpath:/templates/ spring.thymeleaf.suffix=.html
同时在 src/main/resources/templates/ 下创建错误页面,例如 error.html 或 common/error.html。
编写全局异常处理器类
创建一个带 @ControllerAdvice 的类,统一捕获业务异常和系统异常:
- 用
@ExceptionHandler(YourCustomException.class)捕获自定义业务异常,返回指定视图名 - 用
@ExceptionHandler(Exception.class)捕获未预期的异常,返回通用错误页 - 方法返回
String(视图名)或ModelAndView,并可向模板传入错误信息
示例:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BusinessException.class)
public String handleBusinessException(BusinessException e, Model model) {
model.addAttribute("message", e.getMessage());
model.addAttribute("errorCode", e.getErrorCode());
return "common/error"; // 对应 templates/common/error.html
}
@ExceptionHandler(Exception.class)
public String handleUnexpectedException(Exception e, Model model) {
model.addAttribute("message", "系统繁忙,请稍后再试");
model.addAttribute("errorCode", "INTERNAL_ERROR");
return "common/error";
}
}
定义自定义业务异常
便于区分不同业务场景的错误,推荐继承 RuntimeException:
- 包含错误码、提示消息、可选堆栈信息
- 在 Service 层主动抛出,由全局处理器统一拦截
示例:
public class BusinessException extends RuntimeException {
private final String errorCode;
public BusinessException(String errorCode, String message) {
super(message);
this.errorCode = errorCode;
}
public String getErrorCode() {
return errorCode;
}
}
前端页面显示错误信息
在 templates/common/error.html 中使用 Thymeleaf 渲染模型数据:
<div th:text="${message}">默认提示</div>
<div th:text="${errorCode}">错误码</div>
也可加入返回首页、刷新等操作按钮,提升用户体验。
不复杂但容易忽略的是:确保 Controller 方法没有显式返回 ResponseEntity 或 @ResponseBody,否则会跳过视图解析流程;如果接口需要同时支持 JSON 和页面返回,建议按请求头(Accept: text/html)做路由判断。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










