Java 异常的Http状态代码
我有一个SpringBoot控制器,我想为异常返回正确的http代码状态。所以,我的问题是:对于“500”或“409”异常,哪个http statu代码更好 这是我的代码:Java 异常的Http状态代码,java,spring,http,spring-boot,Java,Spring,Http,Spring Boot,我有一个SpringBoot控制器,我想为异常返回正确的http代码状态。所以,我的问题是:对于“500”或“409”异常,哪个http statu代码更好 这是我的代码: @PostMapping(value = {"", "/"}) public ResponseEntity<Response> create(@RequestBody StudioDto studioDto, ServletRequest servletRequest, ServletRespon
@PostMapping(value = {"", "/"})
public ResponseEntity<Response> create(@RequestBody StudioDto studioDto,
ServletRequest servletRequest, ServletResponse servletResponse) {
Response response = new Response();
try {
studioService.createStudio(studioDto);
response.setMessage("The studio was create");
response.setStatusCode(HttpServletResponse.SC_CREATED);
} catch (Exception e) {
response.setMessage("Op we have a little problem");
response.setErrorMessage(e.getMessage());
//Which one
//this one 5xx
response.setStatusCode(500);
//Or this one 4xx
response.setStatusCode(409);
}
return new ResponseEntity(response, response.getHttpStatus());
}
@PostMapping(值={“”“/”})
公共响应创建(@RequestBody StudioDto StudioDto,
ServletRequest ServletRequest,ServletResponse ServletResponse){
响应=新响应();
试一试{
studioService.createStudio(studioDto);
setMessage(“工作室被创建”);
response.setStatusCode(创建了HttpServletResponse.SC_);
}捕获(例外e){
response.setMessage(“Op,我们有一个小问题”);
setErrorMessage(例如getMessage());
//哪一个
//这个是5xx
响应。设置状态代码(500);
//还是这个4xx
响应。设置状态代码(409);
}
返回新的ResponseEntity(response,response.getHttpStatus());
}
这取决于您试图传达的信息。将状态代码视为对调用方下一步操作的指导。如果是用户无法处理的内部服务器错误,则该错误是适当的
服务器遇到意外情况,无法满足请求
另一方面,表示用户可以从概念上解决的冲突:
由于与目标资源的当前状态冲突,无法完成请求。此代码用于用户可能能够解决冲突并重新提交请求的情况
大多数400级错误表明,理论上,用户可以修复这些错误并重新提交
就个人而言,我建议您捕获更精确的异常,并确定每个异常应该返回哪个状态代码,因为这实际上取决于您的用例。到目前为止,您正在捕获
异常
,这可能是任何情况,因此很难判断您应该给呼叫方什么样的指导。5.XX代码表示服务器端的错误,4.XXX代码表示客户端的错误。这里您可以捕获任何异常:
catch (Exception e) {
response.setMessage("Op we have a little problem");
response.setErrorMessage(e.getMessage());
//Which one
//this one 5xx
response.setStatusCode(500);
//Or this one 4xx
response.setStatusCode(409);
}
因此,显然不可能知道问题是来自客户端请求(例如,错误参数)还是来自服务器错误(例如,数据库不一致或编程错误)。为了能够设置精度为4.XXX或5.XXX,您的代码可以依赖一些特定的基本异常,如
ClientErrorException
和ServerErrorException
根据错误原因抛出一个或另一个,然后您可以依靠它们设置正确的状态代码:
try {
studioService.createStudio(studioDto);
response.setMessage("The studio was create");
response.setStatusCode(HttpServletResponse.SC_CREATED);
}
catch (ClientErrorException e) {
response.setStatusCode(409);
}
catch (ServerErrorException e) {
response.setStatusCode(500);
}
另一种方法是在异常基类中添加状态代码字段。你可以这么简单地写:
try {
studioService.createStudio(studioDto);
response.setMessage("The studio was create");
response.setStatusCode(HttpServletResponse.SC_CREATED);
}
catch (MyRestException e) {
response.setStatusCode(e.getStatusCode());
}
当您在客户端请求中检测到错误(4.XXX
)时,可以直接从代码中抛出这些自定义异常。这样,您可以考虑所有与服务器处理相关的异常(<代码> 5。XXX < /代码>)。
Spring异常处理程序可以轻松执行此任务。这不是处理异常的推荐方法,您应该使用控制器建议,请检查此选项 状态代码由特定场景定义,500表示内部服务器错误,我将使用该错误解决未指定其原因的问题,对于409,目标资源上的it重新编号冲突 由于与当前请求冲突,无法完成请求 目标资源的状态。此代码用于以下情况: 用户可能能够解决冲突并重新提交 请求
你有许多其他的状态代码,它们适用于不同的情况,因此我认为没有特定的状态代码是正确的答案,你可以查看更多信息,Todd给出了一个很好的链接。这是一种更好的思考方式:
- 1××信息
- 2×成功
- 3×重定向
- 4×客户端错误*400错误请求*401未授权 ... * 405方法不允许
- 5×服务器错误*500内部服务器错误*501未实现*502网关错误
- 如果客户端请求为“坏”(例如,非法用户名/密码),则返回4xx
- 如果服务器以某种方式出现故障(例如,您无法读取数据库),则返回5xx
我使用的一个粗略准则是:考虑重试。如果对同一请求的重试有可能成功,则为5xx(例如:几秒钟后解决的数据库连接问题)。如果对同一请求进行重试总会导致此错误,则为4xx(例如:请求中的无效字段)。这样,客户机就知道重试是否有意义。