微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

EntityNotFoundException情况下的HTTP状态

如何解决EntityNotFoundException情况下的HTTP状态

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

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

解决方法

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:您可能对该主题有不同的看法,这只是我的解释。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。