EntityNotFoundException情况下的HTTP状态

时间:2020-10-09 10:59:20

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

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

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

1 个答案:

答案 0 :(得分: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没有内容,在您的存储中找不到第3号的盒子

现在让我们问问第3号方框中的内容:

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

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