Spring Boot 如何使用 @ExceptionHandler 注解进行局部异常处理

简介: Spring Boot 如何使用 @ExceptionHandler 注解进行局部异常处理

Spring Boot 如何使用 @ExceptionHandler 注解进行局部异常处理


在 Web 应用程序中,异常处理是非常重要的一部分。在 Spring Boot 中,可以使用 @ExceptionHandler 注解来处理控制器中的异常。本文将介绍如何使用 @ExceptionHandler 注解进行局部异常处理,并提供一些示例代码来帮助您更好地理解。


a9a9ad3f0005786d39c7c717c378efba_b0ef1f3543164b1dbb9ea944bda5a256.png


@ExceptionHandler 注解简介


@ExceptionHandler 注解是 Spring MVC 框架提供的一种异常处理机制。当控制器中抛出指定类型的异常时,Spring MVC 会自动调用使用 @ExceptionHandler 注解标记的方法来处理异常。


例如,以下代码演示了如何使用 @ExceptionHandler 注解来处理 NumberFormatException 异常:


@RestController
public class DemoController {
    @GetMapping("/test")
    public String test(@RequestParam("number") String number) {
        Integer.parseInt(number);
        return "success";
    }
    @ExceptionHandler(NumberFormatException.class)
    public ResponseEntity<String> handleNumberFormatException(NumberFormatException ex) {
        return ResponseEntity.badRequest().body("Invalid number format");
    }
}

在上面的代码中,我们定义了一个名为 DemoController 的控制器,并在其中提供了一个名为 test 的方法,用于将字符串转换为整数。如果字符串格式不正确,则会抛出 NumberFormatException 异常。我们还定义了一个名为 handleNumberFormatException 的方法,并使用 @ExceptionHandler 注解来处理 NumberFormatException 异常。如果控制器中抛出 NumberFormatException 异常,则会调用该方法来处理异常,并返回一个 HTTP 400 错误响应。


局部异常处理


在 Spring Boot 中,可以在控制器的方法上使用 @ExceptionHandler 注解来实现局部异常处理。这意味着您可以为每个方法定义自己的异常处理逻辑。


例如,以下代码演示了如何在控制器的方法上使用 @ExceptionHandler 注解来处理 UserNotFoundException 异常:

@RestController
public class DemoController {
    @GetMapping("/users/{id}")
    public User getUser(@PathVariable Long id) {
        User user = userRepository.findById(id)
                .orElseThrow(() -> new UserNotFoundException(id));
        return user;
    }
    @ExceptionHandler(UserNotFoundException.class)
    public ResponseEntity<String> handleUserNotFoundException(UserNotFoundException ex) {
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
    }
}

在上面的代码中,我们定义了一个名为 getUser 的方法,并使用 @PathVariable 注解将 URL 中的参数映射到方法的参数中。如果找不到指定 ID 的用户,则会抛出 UserNotFoundException 异常。我们还定义了一个名为 handleUserNotFoundException 的方法,并使用 @ExceptionHandler 注解来处理 UserNotFoundException 异常。如果控制器中抛出 UserNotFoundException 异常,则会调用该方法来处理异常,并返回一个 HTTP 404 错误响应。


总结


在本文中,我们介绍了如何使用 @ExceptionHandler 注解进行局部异常处理,并提供了一些示例代码来帮助您更好地理解。使用 @ExceptionHandler 注解可以为每个方法定义自己的异常处理逻辑,使代码更加清晰和可维护。希望这篇文章对您有所帮助,谢谢阅读!


以下是完整的示例代码:


@RestController
public class DemoController {
    @GetMapping("/test")
    public String test(@RequestParam("number") String number) {
        Integer.parseInt(number);
        return "success";
    }
    @ExceptionHandler(NumberFormatException.class)
    public ResponseEntity<String> handleNumberFormatException(NumberFormatException ex) {
        return ResponseEntity.badRequest().body("Invalid number format");
    }
    @GetMapping("/users/{id}")
    public User getUser(@PathVariable Long id) {
        User user = userRepository.findById(id)
                .orElseThrow(() -> new UserNotFoundException(id));
        return user;
    }
    @ExceptionHandler(UserNotFoundException.class)
    public ResponseEntity<String> handleUserNotFoundException(UserNotFoundException ex) {
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
    }
}
@ResponseStatus(HttpStatus.NOT_FOUND)
public class UserNotFoundException extends RuntimeException {
    public UserNotFoundException(Long id) {
        super("User not found with id:" + id);
    }
}
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}

相关文章
|
5月前
|
缓存 监控 Java
SpringBoot @Scheduled 注解详解
使用`@Scheduled`注解实现方法周期性执行,支持固定间隔、延迟或Cron表达式触发,基于Spring Task,适用于日志清理、数据同步等定时任务场景。需启用`@EnableScheduling`,注意线程阻塞与分布式重复问题,推荐结合`@Async`异步处理,提升任务调度效率。
877 128
|
4月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
568 2
|
5月前
|
XML Java 数据格式
常用SpringBoot注解汇总与用法说明
这些注解的使用和组合是Spring Boot快速开发和微服务实现的基础,通过它们,可以有效地指导Spring容器进行类发现、自动装配、配置、代理和管理等核心功能。开发者应当根据项目实际需求,运用这些注解来优化代码结构和服务逻辑。
426 12
|
5月前
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
308 0
探索Spring Boot的@Conditional注解的上下文配置
|
Java 应用服务中间件 Maven
深入SpringBoot核心注解原理(下)
深入SpringBoot核心注解原理(下)
深入SpringBoot核心注解原理(下)
|
XML 消息中间件 安全
深入SpringBoot核心注解原理(上)
深入SpringBoot核心注解原理(上)
深入SpringBoot核心注解原理(上)
|
4月前
|
JavaScript Java 关系型数据库
基于springboot的项目管理系统
本文探讨项目管理系统在现代企业中的应用与实现,分析其研究背景、意义及现状,阐述基于SSM、Java、MySQL和Vue等技术构建系统的关键方法,展现其在提升管理效率、协同水平与风险管控方面的价值。
|
4月前
|
搜索推荐 JavaScript Java
基于springboot的儿童家长教育能力提升学习系统
本系统聚焦儿童家长教育能力提升,针对家庭教育中理念混乱、时间不足、个性化服务缺失等问题,构建科学、系统、个性化的在线学习平台。融合Spring Boot、Vue等先进技术,整合优质教育资源,提供高效便捷的学习路径,助力家长掌握科学育儿方法,促进儿童全面健康发展,推动家庭和谐与社会进步。
|
4月前
|
JavaScript Java 关系型数据库
基于springboot的古树名木保护管理系统
本研究针对古树保护面临的严峻挑战,构建基于Java、Vue、MySQL与Spring Boot技术的信息化管理系统,实现古树资源的动态监测、数据管理与科学保护,推动生态、文化与经济可持续发展。