springboot全局异常处理详解

发布时间 - 2026-01-11 01:01:49    点击率:

一、单个controller范围的异常处理

package com.xxx.secondboot.web;

import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.xxx.secondboot.exception.MyExceptionResponse;

import io.swagger.annotations.Api;

@Api("测试controllerAdvice和全局异常处理")
@RestController
@RequestMapping("/advice1")
public class AdviceController {

  @RequestMapping(value = "/test1", method = RequestMethod.GET)
  public String test1() {
    throw new RuntimeException("advice1 - exception1");
  }

  @RequestMapping(value = "/test2", method = RequestMethod.GET)
  public String test2() {
    throw new RuntimeException("advice1 - exception2");
  }

  @ExceptionHandler(RuntimeException.class)
  public MyExceptionResponse exceptionHandler() {
    MyExceptionResponse resp = new MyExceptionResponse();
    resp.setCode(300);
    resp.setMsg("exception-Handler");
    return resp;
  }

}

说明:

  1. 在controller中加入被@ExceptionHandler修饰的类即可(在该注解中指定该方法需要处理的那些异常类)
  2. 该异常处理方法只在当前的controller中起作用

二、全部controller范围内起作用的异常处理(全局异常处理)

1、全局异常处理类

package com.xxx.secondboot.web;

import javax.servlet.http.HttpServletResponse;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.xxx.secondboot.exception.MyExceptionResponse;
import com.xxx.secondboot.exception.MyRuntimeException;

//@ControllerAdvice(annotations=RestController.class)
//@ControllerAdvice(basePackages={"com.xxx","com.ooo"})
@ControllerAdvice
public class GlobalExceptionHandler {
  @ExceptionHandler(RuntimeException.class)
  //  @ExceptionHandler(value={RuntimeException.class,MyRuntimeException.class})
  //  @ExceptionHandler//处理所有异常
  @ResponseBody //在返回自定义相应类的情况下必须有,这是@ControllerAdvice注解的规定
  public MyExceptionResponse exceptionHandler(RuntimeException e, HttpServletResponse response) {
    MyExceptionResponse resp = new MyExceptionResponse();
    resp.setCode(300);
    resp.setMsg("exception-Handler");
    //    response.setStatus(600);
    return resp;
  }
}

说明:

  1. @ControllerAdvice是controller的一个辅助类,最常用的就是作为全局异常处理的切面类
  2. @ControllerAdvice可以指定扫描范围
  3. @ControllerAdvice约定了几种可行的返回值,如果是直接返回model类的话,需要使用@ResponseBody进行json转换
    1. 返回String,表示跳到某个view
    2. 返回modelAndView
    3. 返回model + @ResponseBody

2、controller

package com.xxx.secondboot.web;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import io.swagger.annotations.Api;

@Api("测试controllerAdvice和全局异常处理")
@RestController
@RequestMapping("/advice1")
public class AdviceController {

  @RequestMapping(value = "/test1", method = RequestMethod.GET)
  public String test1() {
    throw new RuntimeException("advice1 - exception1");
  }

  @RequestMapping(value = "/test2", method = RequestMethod.GET)
  public String test2() {
    throw new RuntimeException("advice1 - exception2");
  }

  //  @ExceptionHandler(RuntimeException.class)
  //  public MyExceptionResponse exceptionHandler() {
  //    MyExceptionResponse resp = new MyExceptionResponse();
  //    resp.setCode(300);
  //    resp.setMsg("exception-Handler");
  //    return resp;
  //  }

}

注意:

  1. 同一个异常被局部范围异常处理器和全局范围异常处理器同时覆盖,会选择小范围的局部范围处理器
  2. 同一个异常被小范围的异常类和大范围的异常处理器同时覆盖,会选择小范围的异常处理器

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# spring  # boot  # 全局异常  # springboot异常处理  # SpringBoot实现全局异常处理方法总结  # Springboot之自定义全局异常处理的实现  # SpringBoot如何优雅的处理全局异常  # springboot实现全局异常处理及自定义异常类  # SpringBoot全局异常处理机制和配置拦截器方式  # SpringBoot全局异常处理方式  # springboot实现全局异常捕获的使用示例  # Spring Boot全局异常处理实战指南  # 这是  # 几种  # 自定义  # 只在  # 定了  # 跳到  # 最常用  # 大家多多  # 中起  # 返回值  # 情况下  # RestController  # exception  # MyExceptionResponse  # swagger  # method  # RequestMapping  # RequestMethod  # io  # Api 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何与Inertia.js和Vue/React构建现代单页应用  怎么用AI帮你为初创公司进行市场定位分析?  canvas 画布在主流浏览器中的尺寸限制详细介绍  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  如何选择PHP开源工具快速搭建网站?  网站建设保证美观性,需要考虑的几点问题!  Laravel模型事件有哪些_Laravel Model Event生命周期详解  图册素材网站设计制作软件,图册的导出方式有几种?  Laravel如何实现文件上传和存储?(本地与S3配置)  如何快速查询网址的建站时间与历史轨迹?  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  Laravel Session怎么存储_Laravel Session驱动配置详解  免费视频制作网站,更新又快又好的免费电影网站?  昵图网官网入口 昵图网素材平台官方入口  如何获取上海专业网站定制建站电话?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  Laravel如何记录自定义日志?(Log频道配置)  谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复  济南网站建设制作公司,室内设计网站一般都有哪些功能?  linux top下的 minerd 木马清除方法  Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】  香港服务器租用费用高吗?如何避免常见误区?  Laravel怎么在Blade中安全地输出原始HTML内容  Java遍历集合的三种方式  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  如何快速生成ASP一键建站模板并优化安全性?  Python3.6正式版新特性预览  如何在搬瓦工VPS快速搭建网站?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  如何快速建站并高效导出源代码?  高端企业智能建站程序:SEO优化与响应式模板定制开发  如何快速搭建高效可靠的建站解决方案?  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  高性价比服务器租赁——企业级配置与24小时运维服务  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  如何用已有域名快速搭建网站?  Laravel如何使用Gate和Policy进行授权?(权限控制)  如何破解联通资金短缺导致的基站建设难题?  如何用好域名打造高点击率的自主建站?  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  如何在阿里云服务器自主搭建网站?  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  Laravel如何实现API速率限制?(Rate Limiting教程)  如何在Tomcat中配置并部署网站项目?  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】