繁体   English   中英

在 Spring Boot 中处理异常的最佳方法是什么?

[英]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吗? 还是只需要扔在控制器中? 我正在寻求处理异常的最佳实践。

您使用的方式非常好。

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

您也可以在 @Service 层中抛出异常。 [那是同样的事情] ControllerAdvice 会抓住它。

您可以按照自己的方式自定义异常。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM