关于SpringBoot使用@ExceptionHandler注解局部异常处理

 更新时间:2023年07月11日 09:14:34   作者:硬件人某某某  
这篇文章主要介绍了关于SpringBoot使用@ExceptionHandler注解局部异常处理,SpringBoot提供了多种方式来处理异常,在本文中,我们将介绍SpringBoot中的@ExceptionHandler注解,演示如何使用它进行局部异常处理

介绍

在开发 Web 应用程序时,异常处理是非常重要的一部分。SpringBoot 提供了多种方式来处理异常,其中之一是使用 @ExceptionHandler 注解进行局部异常处理。使用 @ExceptionHandler 注解,我们可以在 Controller 层或方法级别上处理异常,而不用在整个应用程序中处理。

@ExceptionHandler 注解

@ExceptionHandler 注解是 SpringFramework 提供的一个注解,用于处理控制器中出现的异常。当在控制器方法中抛出异常时,SpringBoot 会查找带有 @ExceptionHandler 注解的方法,并调用它来处理异常。

下面是一个简单的例子:

@RestController
public class UserController {
    @GetMapping("/users/{id}")
    public User getUser(@PathVariable int id) {
        User user = userRepository.findById(id);
        if (user == null) {
            throw new UserNotFoundException("User not found");
        }
        return user;
    }
    @ExceptionHandler(UserNotFoundException.class)
    public ResponseEntity<ErrorResponse> handleUserNotFoundException(UserNotFoundException ex) {
        ErrorResponse error = new ErrorResponse(HttpStatus.NOT_FOUND.value(), ex.getMessage());
        return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);
    }
}

在上面的代码中,我们定义了一个 UserController 类,并实现了一个 getUser 方法。如果用户不存在,则抛出 UserNotFoundException 异常。然后,我们使用 @ExceptionHandler 注解定义了一个 handleUserNotFoundException 方法,用于处理 UserNotFoundException 异常。在该方法中,我们创建了一个 ErrorResponse 对象,包含了错误响应的状态码和消息,然后将其封装在 ResponseEntity 对象中返回。

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

要使用 @ExceptionHandler 注解进行局部异常处理,请按照以下步骤操作:

第 1 步:定义自定义异常

在代码中定义自定义异常,继承自 Exception 或 RuntimeException 类。例如:

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

在上面的代码中,我们定义了一个名为 UserNotFoundException 的自定义异常,它继承自 RuntimeException 类。

第 2 步:抛出异常

在控制器方法中抛出自定义异常。例如:

@GetMapping("/users/{id}")
public User getUser(@PathVariable int id) {
    User user = userRepository.findById(id);
    if (user == null) {
        throw new UserNotFoundException("User not found");
    }
    return user;
}

在上面的代码中,如果用户不存在,则抛出 UserNotFoundException 异常。

第 3 步:处理异常

使用 @ExceptionHandler 注解定义一个方法,用于处理自定义异常。例如:

@ExceptionHandler(UserNotFoundException.class)
public ResponseEntity<ErrorResponse> handleUserNotFoundException(UserNotFoundException ex) {
    ErrorResponse error = new ErrorResponse(HttpStatus.NOT_FOUND.value(), ex.getMessage());
    return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);
}

在上面的代码中,我们使用 @ExceptionHandler(UserNotFoundException.class) 注解定义了一个方法 handleUserNotFoundException,用于处理 UserNotFoundException 异常。在该方法中,我们创建了一个 ErrorResponse 对象,包含了错误响应的状态码和消息,然后将其封装在 ResponseEntity 对象中返回。

示例

以下是一个完整的示例:

UserController.java

@RestController
public class UserController {
    @Autowired
    private UserRepository userRepository;
    @GetMapping("/users/{id}")
    public User getUser(@PathVariable int id) {
        User user = userRepository.findById(id);
        if (user == null) {
            throw new UserNotFoundException("User not found");
        }
        return user;
    }
    @PostMapping("/users")
    public User createUser(@RequestBody User user) {
        userRepository.save(user);
        return user;
    }
    @PutMapping("/users/{id}")
    public User updateUser(@PathVariable int id, @RequestBody User user) {
        User existingUser = userRepository.findById(id);
        if (existingUser == null) {
            throw new UserNotFoundException("User not found");
        }
        existingUser.setName(user.getName());
        existingUser.setAge(user.getAge());
        userRepository.save(existingUser);
        return existingUser;
    }
    @DeleteMapping("/users/{id}")
    public void deleteUser(@PathVariable int id) {
        UseruserRepository.deleteById(id);
    }
    @ExceptionHandler(UserNotFoundException.class)
    public ResponseEntity<ErrorResponse> handleUserNotFoundException(UserNotFoundException ex) {
        ErrorResponse error = new ErrorResponse(HttpStatus.NOT_FOUND.value(), ex.getMessage());
        return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);
    }
}

UserNotFoundException.java

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

ErrorResponse.java

public class ErrorResponse {
    private int status;
    private String message;
    public ErrorResponse(int status, String message) {
        this.status = status;
        this.message = message;
    }
    public int getStatus() {
        return status;
    }
    public String getMessage() {
        return message;
    }
}

在上面的代码中,我们定义了一个 UserController 类,实现了 getUser、createUser、updateUser 和 deleteUser 方法。如果用户不存在,则抛出 UserNotFoundException 异常。然后,我们使用 @ExceptionHandler 注解定义了一个 handleUserNotFoundException 方法,用于处理 UserNotFoundException 异常。在该方法中,我们创建了一个 ErrorResponse 对象,包含了错误响应的状态码和消息,然后将其封装在 ResponseEntity 对象中返回。

原理

当控制器方法抛出异常时,SpringBoot 会在控制器类中查找带有 @ExceptionHandler 注解的方法,并调用它来处理异常。@ExceptionHandler 注解的方法必须具有以下特征:

  • 方法必须是 public、没有返回值,并且具有一个参数,该参数类型为抛出的异常类型。
  • 方法必须使用 @ExceptionHandler 注解进行注解,该注解的参数为抛出的异常类型。

当控制器方法抛出异常时,SpringBoot 将异常传递给带有 @ExceptionHandler 注解的方法。该方法将处理异常,并返回一个 ResponseEntity 对象,该对象包含错误响应的状态码和消息。

总结

在本文中,我们介绍了 SpringBoot 中的 @ExceptionHandler 注解,演示了如何使用它进行局部异常处理。使用 @ExceptionHandler 注解,我们可以在 Controller 层或方法级别上处理异常。当控制器方法抛出异常时,SpringBoot 会查找带有 @ExceptionHandler 注解的方法,并调用它来处理异常。要使用 @ExceptionHandler 注解进行局部异常处理,需要定义自定义异常、抛出异常和处理异常。

到此这篇关于关于SpringBoot使用@ExceptionHandler注解局部异常处理的文章就介绍到这了,更多相关@ExceptionHandler局部异常处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java评论、回复功能设计与实现方法

    java评论、回复功能设计与实现方法

    很多项目或者系统都有评论或者回复的需求,但评论回复的实现往往都比较复杂,也不好实现,下面这篇文章主要给大家介绍了关于java评论、回复功能设计与实现的相关资料,需要的朋友可以参考下
    2022-06-06
  • 关于ConditionalOnMissingBean失效问题的追踪

    关于ConditionalOnMissingBean失效问题的追踪

    这篇文章主要介绍了关于ConditionalOnMissingBean失效问题的追踪方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • SpringBoot实现异步消息处理的代码示例

    SpringBoot实现异步消息处理的代码示例

    在现代应用程序中,异步消息处理是一项至关重要的任务。它可以提高应用程序的性能、可伸缩性和可靠性,同时也可以提供更好的用户体验,本文将介绍如何使用Spring Boot实现异步消息处理,并提供相应的代码示例
    2023-06-06
  • Springboot打包部署修改配置文件的方法

    Springboot打包部署修改配置文件的方法

    这篇文章主要介绍了Springboot打包部署修改配置文件的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • Mybatis Order by动态参数防注入方式

    Mybatis Order by动态参数防注入方式

    这篇文章主要介绍了Mybatis Order by动态参数防注入方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Java并发编程中的volatile关键字详解

    Java并发编程中的volatile关键字详解

    这篇文章主要介绍了Java并发编程中的volatile关键字详解,volatile 用于保证我们某个变量的可见性,使其一直存放在主存中,不被移动到某个线程的私有工作内存中,需要的朋友可以参考下
    2023-08-08
  • SpringBoot限制文件或图片上传大小的两种配置方法

    SpringBoot限制文件或图片上传大小的两种配置方法

    这篇文章主要介绍了SpringBoot限制文件或图片上传大小的两种配置方法,一种是配置在启动类中,一种是配置在application.yml或者application.properties中,需要的朋友可以参考下
    2018-03-03
  • spring 中事务注解@Transactional与trycatch的使用

    spring 中事务注解@Transactional与trycatch的使用

    这篇文章主要介绍了spring 中事务注解@Transactional与trycatch的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • java安全之CommonsCollections4详解

    java安全之CommonsCollections4详解

    这篇文章主要介绍了java安全之CommonsCollections4详解
    2022-08-08
  • java中的常用集合类整理

    java中的常用集合类整理

    本篇文章给大家带来的内容是关于java中List集合及其实现类的方法介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。下面我们就来学习一下吧,希望能给你带来帮助
    2021-06-06

最新评论