EntityNotFoundException 情况下的 HTTP 状态
HTTP Status in case of EntityNotFoundException
我正在处理我的应用程序中的异常处理。在我的服务中,我有这个方法:
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);
}
}
我见过他们这样做的例子 here and here 但在我看来这像是对 HttpStatus
的滥用。资源是 API 端点(这很好),而不是未找到的实体。处理此用例的最佳方法是什么?
根据 IQbrod 的回答,我创建了一个例外:
@ResponseStatus(value = HttpStatus.NO_CONTENT)
public class MyEntityNotFoundException extends RuntimeException {
public MyEntityNotFoundException(String message) {
super(message);
}
}
我现在抛出而不是 EntityNotFoundException
404
和 204
之间永恒的争论。
让我们在这里举个例子。您的实体现在是一个充满魔法物品的 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:你可能对这个问题有不同的看法,这只是我的解释。
我正在处理我的应用程序中的异常处理。在我的服务中,我有这个方法:
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);
}
}
我见过他们这样做的例子 here and here 但在我看来这像是对 HttpStatus
的滥用。资源是 API 端点(这很好),而不是未找到的实体。处理此用例的最佳方法是什么?
根据 IQbrod 的回答,我创建了一个例外:
@ResponseStatus(value = HttpStatus.NO_CONTENT)
public class MyEntityNotFoundException extends RuntimeException {
public MyEntityNotFoundException(String message) {
super(message);
}
}
我现在抛出而不是 EntityNotFoundException
404
和 204
之间永恒的争论。
让我们在这里举个例子。您的实体现在是一个充满魔法物品的 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:你可能对这个问题有不同的看法,这只是我的解释。