千家信息网

SpringBoot处理全局统一异常的方法和区别

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,这篇文章主要讲解了"SpringBoot处理全局统一异常的方法和区别",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"SpringBoot处理全局统一异常
千家信息网最后更新 2025年11月07日SpringBoot处理全局统一异常的方法和区别

这篇文章主要讲解了"SpringBoot处理全局统一异常的方法和区别",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"SpringBoot处理全局统一异常的方法和区别"吧!

前言

在后端发生异常或者是请求出错时,前端通常显示如下

Whitelabel Error PageThis application has no explicit mapping for /error, so you are seeing this as a fallback.

Fri Jun 07 15:38:07 CST 2019There was an unexpected error (type=Not Found, status=404).No message available

对于用户来说非常不友好。

本文主要讲解如何在SpringBoot应用中使用统一异常处理。

实现方式

第一种:使用@ControllerAdvice和@ExceptionHandler注解 第二种: 使用ErrorController类来实现。

第一种:使用@ControllerAdvice和@ExceptionHandler注解

@Slf4j@ControllerAdvicepublic class GlobalExceptionHandler { @ResponseBody @ExceptionHandler(NullPointerException.class) public BaseResult globalException(HttpServletResponse response,NullPointerException ex){ log.info("GlobalExceptionHandler...");log.info("错误代码:" + response.getStatus());BaseResult result = new WebResult(WebResult.RESULT_FAIL,"request error:"+response.getStatus() ,"GlobalExceptionHandler:"+ex.getMessage()); return result;}}

注解@ControllerAdvice表示这是一个控制器增强类,当控制器发生异常且符合类中定义的拦截异常类,将会被拦截。

可以定义拦截的控制器所在的包路径

@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Componentpublic @interface ControllerAdvice { @AliasFor("basePackages") String[] value() default {}; @AliasFor("value") String[] basePackages() default {}; Class[] basePackageClasses() default {}; Class[] assignableTypes() default {}; Class[] annotations() default {};}

注解ExceptionHandler定义拦截的异常类

@Target({ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface ExceptionHandler { Class[] value() default {};}

第二种: 使用ErrorController类来实现。

系统默认的错误处理类为BasicErrorController,将会显示如上的错误页面。

这里编写一个自己的错误处理类,上面默认的处理类将不会起作用。

getErrorPath()返回的路径服务器将会重定向到该路径对应的处理类,本例中为error方法。

@Slf4j@RestControllerpublic class HttpErrorController implements ErrorController { private final static String ERROR_PATH = "/error"; @ResponseBody @RequestMapping(path = ERROR_PATH ) public BaseResult error(HttpServletRequest request, HttpServletResponse response){ log.info("访问/error" + " 错误代码:" + response.getStatus()); BaseResult result = new WebResult(WebResult.RESULT_FAIL,"HttpErrorController error:"+response.getStatus());return result; } @Override public String getErrorPath() { return ERROR_PATH; }}

测试

以上定义了一个统一的返回类BaseResult,方便前端进行处理。

package com.microblog.common.result;import java.io.Serializable;public class BaseResult implements Serializable { private static final long serialVersionUID = 1L; public static final int RESULT_FAIL = 0; public static final int RESULT_SUCCESS = 1; //返回代码 private Integer code; //返回消息 private String message; //返回对象 private Object data; public BaseResult(Integer code, String message) { this.code = code; this.message = message; } public BaseResult(Integer code, String message, Object object) { this.code = code; this.message = message; this.data = object; } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public Object getData() { return data; } public void setData(Object data) { this.data = data; }}

编写一个测试控制器

@Slf4j@RestController@RequestMapping("/user")public class TestController { @RequestMapping("/info1") public String test(){ log.info("/user/info1"); throw new NullPointerException("TestController have exception"); }}

1.发出一个错误的请求,也就是没有对应的处理类。

从返回可以看到是由HttpErrorController类处理

{"code":0,"message":"HttpErrorController error:404","data":null}

2.发出一个正常的请求(TestController的test()处理),处理类中抛出空异样

从返回中可以看出是由GlobalExceptionHandler类处理

{"code":0,"message":"request error:200","data":"GlobalExceptionHandler:TestController have exception"}

区别

1.注解@ControllerAdvice方式只能处理控制器抛出的异常。此时请求已经进入控制器中。

2.类ErrorController方式可以处理所有的异常,包括未进入控制器的错误,比如404,401等错误

3.如果应用中两者共同存在,则@ControllerAdvice方式处理控制器抛出的异常,类ErrorController方式未进入控制器的异常。

4.@ControllerAdvice方式可以定义多个拦截方法,拦截不同的异常类,并且可以获取抛出的异常信息,自由度更大。

感谢各位的阅读,以上就是"SpringBoot处理全局统一异常的方法和区别"的内容了,经过本文的学习后,相信大家对SpringBoot处理全局统一异常的方法和区别这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

处理 控制器 控制 错误 方法 统一 方式 注解 全局 代码 学习 内容 前端 是由 路径 应用 测试 不同 自由 也就是 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 诊断测试索引数据库 海康服务器内存条在哪 数据库查询优化的艺术 弘客深圳网络技术有限公司 软件开发总监薪酬 数据库按存储内容分类 云数据库适合哪些行业 聊天软件开发好牌子推荐 武汉软件开发的工作室 热搜榜网络安全宣传语 卫视软件开发 周鸿祎网络安全保障 上海华为服务器维修调试 数据库系统结构与数据模型 天津诚信网络技术咨询哪家好 数据库不能脱机 一款小型游戏要多大服务器 提高网络安全对策 MC服务器金币商城 面向对象数据结构与软件开发 长达九年无人管理的服务器 上海新时代网络技术出厂价格 中国工商软件开发成都待遇 网络安全关键信息基础设施认定 什么政府部门有软件开发人员 深圳网络安全技术培训攻防技术 公安系统网络安全渗透工程师做什么工作 北京东龙网络技术有限公司招聘 python的字典数据库 移动ntp服务器
0