【问题标题】:HTTP Status in case of EntityNotFoundException发生 EntityNotFoundException 时的 HTTP 状态
【发布时间】:2021-01-24 10:56:23
【问题描述】:

我正在处理我的应用程序中的异常。在我的服务中,我有这个方法:

public Optional<Entity> getEntityById(Long id) {
    return Optional.of(EntityMapper.fromEntityToDto(repository
            .findById(id)
            .orElseThrow(() -> new EntityNotFoundException("No entry was found for" + " id: " + id))));
}

在我的异常处理程序中,我有以下内容

@ControllerAdvice
public class ControllerAdvisor extends ResponseEntityExceptionHandler {

    @ExceptionHandler(EntityNotFoundException.class)
    public ResponseEntity<Object> handleEntityNotFoundException(EntityNotFoundException ex, WebRequest request) {

        ErrorResponse errorResponse = new ErrorResponse(HttpStatus.NOT_FOUND, "Entity not found", ex.getMessage());
        return new ResponseEntity<>(errorResponse, HttpStatus.NOT_FOUND);
    }
}

我已经看到他们这样做herehere 的例子,但在我看来这像是对HttpStatus 的滥用。该资源是 API 端点(这很好),而不是未找到的实体。处理此用例的最佳方法是什么?


根据 IQbrod 的回答,我创建了一个例外:

@ResponseStatus(value = HttpStatus.NO_CONTENT)
public class MyEntityNotFoundException extends RuntimeException {

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

我现在抛出的不是EntityNotFoundException

【问题讨论】:

    标签: java exception http-status-code-404 http-status-codes


    【解决方案1】:

    404204 之间的永恒争论。
    让我们尝试在这里举个例子。你的实体现在是一个充满魔法物品的box
    Box1:这是一个盒子,里面有一匹漂亮的小马。
    Box2 : 这是一个空盒子。

    让我们询问第一个盒子的内容:

    GET https://{URL}/v1/boxes/1/content
    
    • 200(小马)

    现在让我们询问第二个盒子的内容:

    GET https://{URL}/v1/boxes/2/content
    
    • 204 无内容

    让我们询问第 3 号盒子(盒子本身,而不是内容):

    GET https://{URL}/v1/boxes/3
    
    • 204 NO CONTENT,在您的存储中,您找不到任何编号为 3 的盒子

    现在让我们问一下 3 号盒子里面有什么:

    GET https://{URL}/v1/boxes/3/content
    
    • 404 盒子不存在。
      这里的 404 确实意味着找不到资源,用户没有检查该框是否存在并且他的请求是无意义的(基本上是 4xx)。

    PS:您可能对这个问题有不同的看法,这只是我的解释。

    【讨论】:

    • 我同意。你会说虽然抛出异常并在ExceptionHandler 中处理它但不是 404 而是将状态设置为 204 是可以的吗?
    • 是的,你决定如何处理异常,异常不是错误。出了点问题,但您仍然可以设法在发出警报之前解决它。
    • 谢谢伙计,我现在创建了一个异常,在这种情况下我会抛出它。在异常中,我将状态设置为 204。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-22
    • 2013-10-07
    相关资源
    最近更新 更多