关于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局部异常处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
- Spring中的@ExceptionHandler注解统一异常处理详解
- SpringMVC使用@ExceptionHandler注解在Controller中处理异常
- Spring的异常处理@ExceptionHandler注解解析
- Spring中@ExceptionHandler注解的使用方式
- Spring中@ExceptionHandler注解的工作原理详解
- Spring @ExceptionHandler注解统一异常处理和获取方法名
- Spring中的@ControllerAdvice和@ExceptionHandler注解处理全局异常
- Spring中的@ExceptionHandler注解详解与应用示例
相关文章
关于ConditionalOnMissingBean失效问题的追踪
这篇文章主要介绍了关于ConditionalOnMissingBean失效问题的追踪方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-03-03spring 中事务注解@Transactional与trycatch的使用
这篇文章主要介绍了spring 中事务注解@Transactional与trycatch的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-06-06
最新评论