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

3

我正在开发一个Spring Boot应用程序。我想知道处理异常的最佳方法是什么。以下是我的代码:

ExceptionHandler.java 我正在使用@ControllerAdvice。什么是最好的选择?@ControllerAdvice还是@RestControllerAdvice

(译注:@ControllerAdvice适用于返回页面,@RestControllerAdvice适用于返回JSON数据)

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

2个回答

3
您使用的方法非常好。
@ ControllerAdvice / @ RestControllerAdvice 用于整个控制器[流程]全局处理异常。您也可以在@Service层中抛出异常,ControllerAdvice会捕获它。 您可以按照自己的方式自定义异常。

非常感谢你的回答和花费时间。 - H Athukorala

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接