首页 > 解决方案 > Java Spring ExceptionHandler 控制器语法和良好实践

问题描述

我想在 Spring 中正确处理我的异常,所以我有一个关于 exceptionHandler 语法的问题:如果它们被异常处理程序捕获,是否可以在控制器中抛出特定异常?

进一步来说 :

这是例外:

public class UnknownUserException extends Exception {

    private static final long serialVersionUID = 1L;

    public UnknownUserException(String message) {
        super(message);
    }
}

这是具有 UnknownUserException 特定方法的 ExceptionHandler :

@ControllerAdvice
@ResponseBody
public class ControllerExceptionHandler {

    @ExceptionHandler(UnknownUserException.class)
    @ResponseStatus(value = HttpStatus.NOT_FOUND)
    public ErrorMessage unknownUserExceptionMessage(UnknownUserException ex, WebRequest request) {
       ErrorMessage message = new ErrorMessage("The user doesn't exist: " +ex.getLocalizedMessage(), ex);
       return message;
      }
}

下面是一个可能引发该异常的映射示例:

@GetMapping({"/user/{id}"})
    public ResponseEntity<UserProfileDto> getById(@PathVariable Long id) throws UnknownUserException {
            UserProfileDto user = userService.findById(id);
            return ResponseEntity.ok(user);
    }

userService.findById(id) 可能会抛出 UnknownUserException。

据我了解,如果服务引发特定异常,controllerAdvice 会“覆盖”控制器,但是,我应该如何处理我的控制器?我应该再次抛出异常(如上)还是捕获特定异常并返回 ResponseEntity(HttpStatus.NOT_FOUND) ?

标签: javaspringexceptioncontroller-advice

解决方案


在理想情况下,当您知道在您的情况下应该立即抛出异常,因为您提到服务方法将抛出UnknownUserException正确的事情。您的 Controller Advice 应该能够处理该异常。ContollerAdvice将处理在请求执行期间抛出的任何匹配异常,而不管异常的来源。

有关处理异常的其他选项,请参阅此链接


推荐阅读