Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 异常的Http状态代码_Java_Spring_Http_Spring Boot - Fatal编程技术网

Java 异常的Http状态代码

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

我有一个SpringBoot控制器,我想为异常返回正确的http代码状态。所以,我的问题是:对于“500”或“409”异常,哪个http statu代码更好

这是我的代码:

@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网关错误

换句话说,每个主要数字(200、400、500等)都是一个类别。您可以通过在“类别”中选择特定错误来“细化”错误代码

关于你原来的问题:

  • 如果客户端请求为“坏”(例如,非法用户名/密码),则返回4xx

  • 如果服务器以某种方式出现故障(例如,您无法读取数据库),则返回5xx

HTTP错误代码的“官方”列表为RFC 7231:


我使用的一个粗略准则是:考虑重试。如果对同一请求的重试有可能成功,则为5xx(例如:几秒钟后解决的数据库连接问题)。如果对同一请求进行重试总会导致此错误,则为4xx(例如:请求中的无效字段)。这样,客户机就知道重试是否有意义。