问题描述
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和here,但是在我看来,这似乎是对HttpStatus
的滥用。资源是API端点(可以),而不是未找到的实体。处理此用例的最佳方法是什么?
@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没有内容,在您的存储中找不到第3号的盒子
现在让我们问问第3号方框中的内容:
GET https://{URL}/v1/boxes/3/content
- 404该框不存在。
这里的404确实意味着找不到资源,用户没有检查该框是否存在并且他的请求未得到响应(基本上是4xx)。
PS:您可能对该主题有不同的看法,这只是我的解释。