SpringMVC通过注解实现全局异常处理问题小结

 更新时间:2025年09月15日 10:20:27   作者:choice of  
文章介绍SpringMVC全局异常处理机制,通过@ControllerAdvice和@ExceptionHandler注解实现统一异常处理,提升代码可维护性与响应一致性,减少重复try-catch代码,增强系统健壮性,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

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

开发应用程序的过程中会遇到各种各样的异常,如数据库连接异常,网络请求异常和业务逻辑异常等。传统的try-catch模式在各个controller中处理由于太过于分散,代码冗余度过高,导致维护成本过高。

全局处理能够高效地解决这一问题

二、Spring全局异常的处理方式

SpringMVC通过@ControllerAdvice和@ExceptionHandler注解来实现全局异常处理

实现步骤:

1 创建自定义异常类
2 创建全局异常处理器,使用@ControllerAdvice注解
3 在处理器类中定义异常处理方法,使用@ExceptionHandler注解指定处理的异常类型
4 在异常处理方法中定义异常响应的格式和内容

三、具体实现

1 创建自定义异常类(以用户未找到为例)

// 用户未找到异常
public class UserNotFoundException extends RuntimeException {
    public UserNotFoundException() {
        super();
    }
    public UserNotFoundException(String message) {
        super(message);
    }
}
// 数据验证异常
public class ValidationException extends RuntimeException {
    public ValidationException(String message) {
        super(message);
    }
}

2 创建全局异常处理器

import org.springframework.http.HttpStatus;
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.ResponseStatus;
// 全局异常处理器,会拦截所有控制器抛出的异常
@ControllerAdvice
public class GlobalExceptionHandler {
    // 处理用户未找到异常
    @ExceptionHandler(UserNotFoundException.class)
    @ResponseBody  // 将返回结果转换为JSON
    @ResponseStatus(HttpStatus.NOT_FOUND)  // 设置HTTP状态码为404
    public Result<Void> handleUserNotFoundException(UserNotFoundException e) {
        return Result.error(404, e.getMessage());
    }
    // 处理数据验证异常
    @ExceptionHandler(ValidationException.class)
    @ResponseBody
    @ResponseStatus(HttpStatus.BAD_REQUEST)  // 设置HTTP状态码为400
    public Result<Void> handleValidationException(ValidationException e) {
        return Result.error(400, e.getMessage());
    }
    // 处理其他未捕获的异常
    @ExceptionHandler(Exception.class)
    @ResponseBody
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)  // 设置HTTP状态码为500
    public Result<Void> handleOtherExceptions(Exception e) {
        // 实际项目中可以在这里记录日志
        return Result.error(500, "服务器内部错误:" + e.getMessage());
    }
}

3 在控制器中使用

@RestController
@RequestMapping("/users")
public class UserController {
    @Autowired
    private UserService userService;
    @GetMapping("/{id}")
    public Result<User> getUser(@PathVariable Long id) {
        // 这里不再需要try-catch,异常会被全局异常处理器捕获
        User user = userService.getUserById(id);
        if (user == null) {
            throw new UserNotFoundException("用户不存在,ID: " + id);
        }
        return Result.success(user);
    }
    @PostMapping
    public Result<User> createUser(@RequestBody User user) {
        if (user.getName() == null || user.getName().isEmpty()) {
            throw new ValidationException("用户名不能为空");
        }
        User savedUser = userService.saveUser(user);
        return Result.success(savedUser);
    }
}

四、工作原理

  1. 当控制器方法中抛出异常时,Spring 会查找是否有匹配的@ExceptionHandler
  2. @ControllerAdvice注解的类会被 Spring 扫描到,并作为全局异常处理器
  3. Spring 会根据抛出的异常类型,找到对应的@ExceptionHandler方法
  4. 执行异常处理方法,返回统一的响应结果

五、高级用法

  • 异常处理的优先级
    • 控制器内部的@ExceptionHandler优先于全局异常处理器
    • 子类异常的处理器优先于父类异常的处理器
  • 结合日志记录
@ExceptionHandler(Exception.class)
public Result<Void> handleOtherExceptions(Exception e) {
    log.error("发生未捕获异常", e);  // 记录异常日志
    return Result.error(500, "服务器内部错误");
}

六、总结

全局异常处理是 SpringMVC框架中一个非常实用的功能,通过@ControllerAdvice@ExceptionHandler注解可以轻松实现:

  1. 减少重复代码,提高开发效率
  2. 统一异常响应格式,便于前端处理
  3. 集中管理异常处理逻辑,便于维护
  4. 可以结合日志记录,方便问题排查

掌握全局异常处理,能让你的代码更加健壮、优雅。

到此这篇关于SpringMVC通过注解实现全局异常处理问题小结的文章就介绍到这了,更多相关SpringMVC全局异常处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Springboot主配置文件解析

    Springboot主配置文件解析

    Spring Boot主配置文件application.yml支持多种核心值类型,包括字符串、数字、布尔值等,文章详细介绍了Profile环境配置和加载位置,本文给大家详细介绍Springboot主配置文件,感兴趣的朋友跟随小编一起看看吧
    2025-11-11
  • MapTask阶段shuffle源码分析

    MapTask阶段shuffle源码分析

    今天小编就为大家分享一篇关于MapTask阶段shuffle源码分析,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Java中CompletableFuture 的详细介绍

    Java中CompletableFuture 的详细介绍

    这篇文章主要介绍了Java中的CompletableFuture,通过创建 CompletableFuture 的对象的工厂方法展开详细的内容介绍,需要的小伙伴可以参考一下
    2022-05-05
  • java多线程中的异常处理机制简析

    java多线程中的异常处理机制简析

    在java多线程程序中,所有线程都不允许抛出未捕获的checked exception,也就是说各个线程需要自己把自己的checked exception处理掉,需要了解的朋友可以参考下
    2012-11-11
  • @FeignClient注解中属性contextId的使用说明

    @FeignClient注解中属性contextId的使用说明

    这篇文章主要介绍了@FeignClient注解中属性contextId的使用说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 使用Spring boot + jQuery上传文件(kotlin)功能实例详解

    使用Spring boot + jQuery上传文件(kotlin)功能实例详解

    本文通过实例代码给大家介绍了使用Spring boot + jQuery上传文件(kotlin) 功能,需要的朋友可以参考下
    2017-07-07
  • Mybatis SqlSessionFactory与SqlSession详细讲解

    Mybatis SqlSessionFactory与SqlSession详细讲解

    SqlSessionFactory是MyBatis的核心类之一,其最重要的功能就是提供创建MyBatis的核心接口SqlSession,所以我们需要先创建SqlSessionFactory,为此我们需要提供配置文件和相关的参数
    2022-11-11
  • 解决Java项目启动报错:Logback configuration error detected:问题

    解决Java项目启动报错:Logback configuration error detected:问题

    这篇文章主要介绍了解决Java项目启动报错:Logback configuration error detected:问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Java用自定义的类作为HashMap的key值实例

    Java用自定义的类作为HashMap的key值实例

    下面小编就为大家带来一篇Java用自定义的类作为HashMap的key值实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • MyBatis结果映射(ResultMap)的使用

    MyBatis结果映射(ResultMap)的使用

    在MyBatis中,结果映射是实现数据库结果集到Java对象映射的核心,它不仅支持简单的字段映射,还能处理字段名不一致、嵌套对象和集合映射等复杂场景,通过ResultMap,开发者可以灵活定义映射关系,以适应各种需求,感兴趣的可以了解一下
    2024-09-09

最新评论