【问题标题】:What is the best way to handle exception in Spring Boot?在 Spring Boot 中处理异常的最佳方法是什么?
【发布时间】:2021-02-22 03:00:12
【问题描述】:

我正在使用 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自动捕获?还是只需要在控制器中抛出?我正在寻找处理异常的最佳实践。

【问题讨论】:

    标签: java spring-boot exception controller-advice


    【解决方案1】:

    我也喜欢你的方法。也许你也想看看 Lombok 和 @SneakyThrows:我发现在方法上抛出 XYZ 是不必要的,但最终你还是在全局范围内处理它们。

    【讨论】:

      【解决方案2】:

      你使用的方式非常好。

      因为 @ControllerAdvice/@RestControllerAdvice 用于在整个控制器 [流程] 中全局处理异常。

      你也可以在@Service layerel 中抛出异常。 [那是一样的] ControllerAdvice 会捕捉到它。

      您可以按照自己的方式自定义例外。

      【讨论】:

      • 非常感谢您的回答和您的时间。
      猜你喜欢
      • 2021-10-26
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多