尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

jcalaBlog 全局异常处理实战:@ControllerAdvice 统一错误处理的最佳实践

jcalaBlog 全局异常处理实战:@ControllerAdvice 统一错误处理的最佳实践 jcalaBlog 全局异常处理实战ControllerAdvice 统一错误处理的最佳实践【免费下载链接】jcalaBloga personal blog site based on springbootsrpingMVCmybatisvelocitybootstrapmysql项目地址: https://gitcode.com/gh_mirrors/jc/jcalaBlogjcalaBlog 是一个基于 Spring Boot Spring MVC MyBatis Velocity Bootstrap MySQL 构建的个人博客系统。本文以 jcalaBlog 的全局异常处理为例手把手带你掌握ControllerAdvice 统一错误处理的最佳实践让新手也能快速理解 Spring Boot 中如何优雅地处理异常告别满屏红色报错日志返回友好、专业的错误页面。为什么需要全局异常处理在传统的 Controller 中每个接口都要用 try-catch 包裹业务逻辑代码又臭又长还容易漏掉异常分支。一旦出现未捕获的异常Spring Boot 默认会返回一个生硬的 Whitelabel Error Page既影响用户体验也不利于排查问题。而Spring Boot 全局异常处理正是为了解决这个痛点把异常处理逻辑从业务代码中抽离出来集中到一个地方统一管理。jcalaBlog 的做法就是经典范例代码量极少却覆盖了整个项目的异常场景。jcalaBlog 的统一异常处理方案 ️jcalaBlog 的异常处理采用自定义异常 全局处理器 错误页面三层结构这也是ControllerAdvice 统一错误处理最主流的落地方式。第一步定义自定义业务异常为了让业务异常与系统异常区分开jcalaBlog 定义了 CommonException.java继承RuntimeException支持带异常原因构造public class CommonException extends RuntimeException { public CommonException(String message) { super(message); } public CommonException(String message, Throwable cause) { super(message, cause); } }实际使用中工具类 FileTools.java 在文件不存在等业务场景直接抛出CommonException语义清晰、调用方便。第二步编写全局异常处理器核心代码在 CtrlExceptionHandler.java短短十几行完成了整个项目的统一异常拦截ControllerAdvice Slf4j public class CtrlExceptionHandler { ResponseStatus(value HttpStatus.INTERNAL_SERVER_ERROR) ExceptionHandler(Exception.class) public String handleIOException(Exception e, Model model) { if (e ! null) { log.warn(e.getMessage()); model.addAttribute(errorMsg, e.getLocalizedMessage()); } return /error; } }三个注解各司其职ControllerAdvice声明这是一个全局异常处理器对所有 Controller 生效ExceptionHandler(Exception.class)拦截所有类型异常异常粒度可按需细化ResponseStatus把响应状态码统一设置为 500服务器内部错误。第三步返回友好的错误页面异常信息通过 Model 传入 error.vm 模板最终渲染成一个简洁的 Page Not Found 风格错误页并用$!{errorMsg}展示具体错误原因。配合后台管理页如 blog_list.vm整个站点的异常体验保持一致。全局异常处理最佳实践要点 ⭐善用日志记录快速定位线上问题在CtrlExceptionHandler中通过Slf4j注入日志用log.warn()记录异常信息既避免了异常静默吞掉又不会因为打印完整堆栈而刷爆日志。排查线上问题时这条日志就是你的第一线索。区分状态码与业务错误ResponseStatus(INTERNAL_SERVER_ERROR)告诉浏览器这是 500 错误而model.addAttribute(errorMsg, ...)则向用户展示可读的错误文案。状态码面向协议、文案面向用户两者分离是统一错误处理的重要设计原则。按异常类型细化处理示例中拦截的是Exception.class兜底异常实际项目中你可以继续新增方法拦截特定异常例如ExceptionHandler(CommonException.class) public String handleCommonException(CommonException e, Model model) { model.addAttribute(errorMsg, e.getMessage()); return /error; }这样Spring Boot 全局异常处理就能做到业务异常给业务提示、系统异常给兜底页面层次分明。结合拦截器构建完整防线jcalaBlog 在 WebMvcConf.java 中注册了UserSecurityInterceptor拦截/admin/**路径。拦截器负责请求准入校验ControllerAdvice负责异常兜底两者结合构成了完整的请求防护链路。如何快速上手这套方案想要在项目里复刻 jcalaBlog 的ControllerAdvice 统一错误处理只需三步新建CtrlExceptionHandler类加上ControllerAdvice注解编写ExceptionHandler方法返回错误页面视图名并注入错误信息准备一个错误页模板如error.vm展示errorMsg。如果你需要完整的可运行代码可以通过git clone https://gitcode.com/gh_mirrors/jc/jcalaBlog拉取 jcalaBlog 源码直接阅读src/main/java/me/jcala/blog/exception/目录下的完整实现。总结 通过 jcalaBlog 这个真实项目我们看到了Spring Boot 全局异常处理的完整落地路径用ControllerAdvice统一拦截、用ExceptionHandler分类处理、用状态码 错误页面组合输出。这套ControllerAdvice 统一错误处理最佳实践不仅让代码更简洁也让你的站点在任何异常面前都保持专业与优雅。赶紧动手为你的 Spring Boot 项目加上这一层安全网吧【免费下载链接】jcalaBloga personal blog site based on springbootsrpingMVCmybatisvelocitybootstrapmysql项目地址: https://gitcode.com/gh_mirrors/jc/jcalaBlog创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表