在 Spring 引导中处理异常的最佳方法是什么?
What is the best way to handle exception in Spring Boot?
我正在 Spring Boot 中开发应用程序。我想知道处理异常的最佳方法是什么。下面是我的代码,
ExceptionHandler.java
我正在使用 @ControllerAdvice
。什么是最好用的? @ControllerAdvice
或 @RestControllerAdvice
?
@ControllerAdvice
public class ExceptionHandler {
@ExceptionHandler(NotFoundException.class)
public ResponseEntity<ErrorResponse> notFound(NotFoundException notFoundException) {
ErrorResponse errorResponse = new ErrorResponse(HttpStatus.NOT_FOUND, notFoundException.getMessage());
return new ResponseEntity<ErrorResponse>(errorResponse, HttpStatus.NOT_FOUND);
}
}
并实现服务层@Service
如下,
@Override
public User update(User newUser) throws NotFoundException {
Optional<User> user = userRepository.findById(newUser.getId());
if (!user.isPresent()) throw new NotFoundException("Record Not Found!");
return userRepository.save(newUser);
}
在Controller.java
代码如下,
@PutMapping
public User update(@RequestBody User user) {
User updatedUser = userService.update(user);
if (updatedUser == null) throw new SomeOtherException("Exception while Updating!");
return updatedUser;
}
所以我的问题是:
上面的方法不好吗?服务层抛异常可以吗,会被@controlleradvice
自动捕获吗?或者只需要在控制器中抛出?我正在寻找处理异常的最佳实践。
你使用的方式完全没问题。
因为@ControllerAdvice/@RestControllerAdvice用于在整个控制器[flow]中全局处理异常。
您也可以在@Service layel 中抛出异常。 [那是一样的东西]
ControllerAdvice 会捕捉到它。
您可以按照自己的方式自定义异常。
我也喜欢你的方法。也许你也想看看 Lombok 和@SneakyThrows:我发现在方法上抛出 XYZ 是不必要的,当最后你无论如何都在全局处理它们时。
我正在 Spring Boot 中开发应用程序。我想知道处理异常的最佳方法是什么。下面是我的代码,
ExceptionHandler.java
我正在使用 @ControllerAdvice
。什么是最好用的? @ControllerAdvice
或 @RestControllerAdvice
?
@ControllerAdvice
public class ExceptionHandler {
@ExceptionHandler(NotFoundException.class)
public ResponseEntity<ErrorResponse> notFound(NotFoundException notFoundException) {
ErrorResponse errorResponse = new ErrorResponse(HttpStatus.NOT_FOUND, notFoundException.getMessage());
return new ResponseEntity<ErrorResponse>(errorResponse, HttpStatus.NOT_FOUND);
}
}
并实现服务层@Service
如下,
@Override
public User update(User newUser) throws NotFoundException {
Optional<User> user = userRepository.findById(newUser.getId());
if (!user.isPresent()) throw new NotFoundException("Record Not Found!");
return userRepository.save(newUser);
}
在Controller.java
代码如下,
@PutMapping
public User update(@RequestBody User user) {
User updatedUser = userService.update(user);
if (updatedUser == null) throw new SomeOtherException("Exception while Updating!");
return updatedUser;
}
所以我的问题是:
上面的方法不好吗?服务层抛异常可以吗,会被@controlleradvice
自动捕获吗?或者只需要在控制器中抛出?我正在寻找处理异常的最佳实践。
你使用的方式完全没问题。
因为@ControllerAdvice/@RestControllerAdvice用于在整个控制器[flow]中全局处理异常。
您也可以在@Service layel 中抛出异常。 [那是一样的东西] ControllerAdvice 会捕捉到它。
您可以按照自己的方式自定义异常。
我也喜欢你的方法。也许你也想看看 Lombok 和@SneakyThrows:我发现在方法上抛出 XYZ 是不必要的,当最后你无论如何都在全局处理它们时。