Ale*_* P. 2 java exception http-status-codes http-status-code-404
我正在研究我的应用程序中的异常处理。在我的服务中我有这个方法:
public Optional<Entity> getEntityById(Long id) {
return Optional.of(EntityMapper.fromEntityToDto(repository
.findById(id)
.orElseThrow(() -> new EntityNotFoundException("No entry was found for" + " id: " + id))));
}
Run Code Online (Sandbox Code Playgroud)
在我的异常处理程序中,我有以下内容
@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);
}
}
Run Code Online (Sandbox Code Playgroud)
我在这里和这里看到过他们这样做的例子,但在我看来,这就像滥用HttpStatus. 该资源是 API 端点(这很好),而不是未找到的实体。处理这个用例的最佳方法是什么?
根据 IQbrod 的回答,我创建了一个例外:
@ResponseStatus(value = HttpStatus.NO_CONTENT)
public class MyEntityNotFoundException extends RuntimeException {
public MyEntityNotFoundException(String message) {
super(message);
}
}
Run Code Online (Sandbox Code Playgroud)
我现在扔掉它而不是EntityNotFoundException
404和之间永恒的争论204。
\n让我们尝试举个例子。你的实体现在充满box了魔法物品。
\nBox1:这是一个盒子,里面有一匹美丽的小马。
\nBox2:这是一个空盒子。
让我们询问第一个盒子的内容:
\nGET https://{URL}/v1/boxes/1/content\nRun Code Online (Sandbox Code Playgroud)\n现在让我们询问第二个框的内容:
\nGET https://{URL}/v1/boxes/2/content\nRun Code Online (Sandbox Code Playgroud)\n让我们询问盒子 n\xc2\xb03 (盒子本身,而不是内容):
\nGET https://{URL}/v1/boxes/3\nRun Code Online (Sandbox Code Playgroud)\n现在让我们问一下盒子 n\xc2\xb03 里面有什么:
\nGET https://{URL}/v1/boxes/3/content\nRun Code Online (Sandbox Code Playgroud)\nPS:你可能对这个问题有不同的看法,这只是我的解释。
\n