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> {
}

相关文章
|
1天前
|
前端开发 Java Spring
蓝易云 - 详解SpringBoot的常用注解
以上就是SpringBoot中常用的一些注解,正确理解和使用这些注解,可以帮助我们更好地使用SpringBoot框架进行开发。
7 0
|
2天前
|
Java Spring 容器
Spring5系列学习文章分享---第六篇(框架新功能系列+整合日志+ @Nullable注解 + JUnit5整合)
Spring5系列学习文章分享---第六篇(框架新功能系列+整合日志+ @Nullable注解 + JUnit5整合)
5 0
|
2天前
|
XML Java 数据库
Spring5系列学习文章分享---第五篇(事务概念+特性+案例+注解声明式事务管理+参数详解 )
Spring5系列学习文章分享---第五篇(事务概念+特性+案例+注解声明式事务管理+参数详解 )
6 0
|
2天前
|
XML Java 数据格式
Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))
Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))
5 0
|
2天前
|
XML druid Java
Spring5系列学习文章分享---第二篇(IOC的bean管理factory+Bean作用域与生命周期+自动装配+基于注解管理+外部属性管理之druid)
Spring5系列学习文章分享---第二篇(IOC的bean管理factory+Bean作用域与生命周期+自动装配+基于注解管理+外部属性管理之druid)
6 0
|
2天前
|
前端开发 Java Spring
蓝易云 - 详解SpringBoot的常用注解
以上就是SpringBoot中常用的一些注解,正确理解和使用这些注解,可以帮助我们更好地使用SpringBoot框架进行开发。
3 0
|
6天前
|
Java
springboot自定义拦截器,校验token
springboot自定义拦截器,校验token
20 6
|
4天前
|
Java 数据库连接 数据库
Spring Boot 集成 MyBatis-Plus 总结
Spring Boot 集成 MyBatis-Plus 总结
|
3天前
|
NoSQL 搜索推荐 Java
使用Spring Boot实现与Neo4j图数据库的集成
使用Spring Boot实现与Neo4j图数据库的集成
|
6天前
|
Java 关系型数据库 MySQL
Mybatis入门之在基于Springboot的框架下拿到MySQL中数据
Mybatis入门之在基于Springboot的框架下拿到MySQL中数据
15 4