首页 > 其他分享 >掌握Spring Boot 3中的全局异常处理:从入门到精通

掌握Spring Boot 3中的全局异常处理:从入门到精通

时间:2024-07-23 13:50:40浏览次数:9  
标签:入门 处理 Spring Boot springframework import org 异常

掌握Spring Boot 3中的全局异常处理:从入门到精通

在开发Spring Boot应用时,异常处理是一个不可忽视的重要环节。特别是当你的应用规模逐渐扩大,代码复杂度增加时,如何优雅地处理异常变得尤为重要。今天,我们就来深入探讨一下如何在Spring Boot 3中实现全局异常处理。

为什么需要全局异常处理?

在一个复杂的应用中,异常可能会在不同的层次和模块中发生。如果我们在每个可能发生异常的地方都进行处理,不仅代码冗余,而且维护起来也非常麻烦。全局异常处理可以帮助我们集中管理这些异常,提高代码的可读性和可维护性。

使用@ControllerAdvice和@ExceptionHandler

Spring Boot提供了一个非常强大的机制来实现全局异常处理,那就是@ControllerAdvice@ExceptionHandler注解。@ControllerAdvice是一个增强型的控制器,它可以拦截并处理控制器层抛出的异常。

创建一个全局异常处理类

首先,我们需要创建一个全局异常处理类,并使用@ControllerAdvice注解标记它。

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(ResourceNotFoundException.class)
    @ResponseStatus(HttpStatus.NOT_FOUND)
    public ResponseEntity<String> handleResourceNotFoundException(ResourceNotFoundException ex) {
        return new ResponseEntity<>(ex.getMessage(), HttpStatus.NOT_FOUND);
    }

    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public ResponseEntity<String> handleGenericException(Exception ex) {
        return new ResponseEntity<>("An unexpected error occurred: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

在这个例子中,我们定义了一个名为GlobalExceptionHandler的类,并使用@ControllerAdvice注解标记它。这个类中包含两个方法,分别处理ResourceNotFoundException和所有其他类型的异常。

自定义异常类

为了更好地演示,我们还需要定义一个自定义异常类ResourceNotFoundException

public class ResourceNotFoundException extends RuntimeException {
    public ResourceNotFoundException(String message) {
        super(message);
    }
}

在控制器中抛出异常

接下来,我们在控制器中模拟抛出这些异常。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
public class MyController {

    @GetMapping("/resource/{id}")
    public String getResource(@PathVariable("id") String id) {
        if ("notfound".equals(id)) {
            throw new ResourceNotFoundException("Resource not found with id: " + id);
        }
        return "Resource with id: " + id;
    }

    @GetMapping("/error")
    public String getError() {
        throw new RuntimeException("Generic error");
    }
}

在这个控制器中,我们定义了两个API端点:/resource/{id}/error。当访问/resource/notfound时,会抛出ResourceNotFoundException,而访问/error时,会抛出一个通用的RuntimeException

运行和测试

启动Spring Boot应用并访问以下URL进行测试:

  • http://localhost:8080/api/resource/notfound:你会看到一个404状态码和自定义的错误信息。
  • http://localhost:8080/api/error:你会看到一个500状态码和通用的错误信息。

进阶:处理更多类型的异常

当然,实际应用中你可能会遇到更多类型的异常。你可以在全局异常处理类中添加更多的@ExceptionHandler方法来处理不同类型的异常。例如,处理MethodArgumentNotValidException来捕获请求参数验证错误:

import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.validation.FieldError;

@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ResponseEntity<Map<String, String>> handleValidationExceptions(MethodArgumentNotValidException ex) {
    Map<String, String> errors = new HashMap<>();
    ex.getBindingResult().getAllErrors().forEach((error) -> {
        String fieldName = ((FieldError) error).getField();
        String errorMessage = error.getDefaultMessage();
        errors.put(fieldName, errorMessage);
    });
    return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST);
}

总结

通过使用@ControllerAdvice@ExceptionHandler,我们可以非常方便地实现Spring Boot应用的全局异常处理。这不仅让我们的代码更加简洁和易于维护,还能提供一致的错误响应格式,提高用户体验。

希望这篇文章能帮助你更好地理解和掌握Spring Boot 3中的全局异常处理。如果你有任何问题或建议,欢迎在评论区留言讨论。Happy coding!

百万大学生都在用的AI写论文工具,篇篇无重复

标签:入门,处理,Spring,Boot,springframework,import,org,异常
From: https://www.cnblogs.com/zhizu/p/18318213

相关文章

  • Spring maven 依赖概述
    Spring依赖包SpringSecurity依赖包在SpringSecurity中,spring-security-config和spring-security-web是SpringSecurity的两个核心模块:spring-security-config:提供了SpringSecurity的配置功能;它包含了基于XML和Java的配置方式,可以用来定义安全策略,比如用户的认证和......
  • django学习入门系列之第四点《案例 走马灯(让字幕滚动)》
    文章目录往期回顾<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title></head><body><spanid="txt">欢迎中国联通领导过来指导</span><scri......
  • 【前端】JavaScript入门及实战91-95
    文章目录91DOM92事件93文档的加载94DOM查询(1)95图片切换的练习91DOM<!DOCTYPEhtml><html><head><title></title><metacharset="utf-8"><style></style></head><body> <buttonid="btn&quo......
  • 【前端】JavaScript入门及实战86-90
    文章目录86正则表达式87字符串和正则相关的方法88正则表达式语法(1)89正则表达式语法(2)90邮件的正则86正则表达式<!DOCTYPEhtml><html><head><title></title><metacharset="utf-8"><scripttype="text/javascript"> /* 使用字面量来创建正......
  • 【前端】JavaScript入门及实战96-100
    文章目录96DOM查询(2)97DOM查询(3)98全选练习(1)99全选练习(2)100全选练习(3)96DOM查询(2)<!DOCTYPEhtml><html><head><title></title><metacharset="utf-8"> <scripttype="text/javascript"> window.onload=......
  • 框架学习 | Streamlit 入门
    一、表格importstreamlitasstimportpandasaspdst.title("我的个人网站......
  • Spring Boot中的 6 种API请求参数读取方式
     ​ 博客主页:   南来_北往......
  • C++多线程并发基础入门教程
    C++多线程并发基础入门教程《C++ConcurrencyinAction,SecondEdition》这本书深入浅出的讲解了C++多线程知识;如果英文水平足够好,可以查阅英文原版,它也有中文译本,虽然翻译过来的质量不如原版,但英文原版阅读太费精力;我推荐新手或者有一定经验的人看这本书。1什么是C++多......
  • 智能停车场系统--前后端分离(可直接落地)使用数据:vue,springBoot,redis,mybatis,mysql等
    系统首页-统计停车车收费收费数据展示实现代码:对菜单控制代码@AutowiredprivateMenuServicemenuService;@AutowiredprivateRoleMenuServiceroleMenuService;@GetMapping("/list")publicResultlist(){List<MenuRoleVO>menuRoleList=this.menuServi......
  • 计算机毕业设计——基于SpringBoot的高并发选课系统
    基于SpringBoot的高并发选课系统私信获取完整代码项目简介本项目主要解决在高校选课场景下,保证选课系统在大量读写压力下不宕机,以及选课时尽可能提高选课QPS,给学生一个良好的选课体验,完成上述功能同时保证选课安全运行效果图其他效果图请到image文件夹中查看技术......