【问题标题】:Spring Boot: returned HTTP response code 400, nested exception is java.io.IOExceptionSpring Boot:返回 HTTP 响应码 400,嵌套异常为 java.io.IOException
【发布时间】:2021-07-05 05:07:24
【问题描述】:

考虑下面的代码。这里,当响应返回的状态码为200时,代码执行完美。

但如果我尝试返回状态码 400,则会在指定行捕获异常。

*错误响应:内部服务器错误:“http://localhost:8090/get-data”的 POST 请求中的 getResponse I/O 错误:服务器返回的 HTTP 响应代码:400 对于 URL:http://localhost:8090/get-data;嵌套异常是 java.io.IOException:服务器返回 HTTP 响应代码:400 用于 URL:http://localhost:8090/get-data

连接:关闭,内容长度:485,内容类型:application/json,日期:2021 年 4 月 8 日星期四 20:25:47 GMT*

为什么返回状态 400 时会抛出异常?

 @RestController
    Class ABC{
    
        @Autowired
        RestTemplate template;
    
        @PostMapping("....")
        ResponseEntity<Object> getResponse(){
            ResponseEntity<String> response
            try{
              HttpEntity<Object> body=new HttpEntity(obj,header); // data obj & httpheader
              response=template.postForEntity("http://localhost:8090/get- 
                       data",body,String.class);
            }catch(HttpStatusCodeException ex){
                  throw....
            }catch(Exception ex){
                throw Internal Server Error.....  //Exception is thrown here
            }       
            if(response.getStatusCodeValue()==200){
                 ...
            }
               ...
    
        }
    }
    
    @RestController
    Class XYZ{
       
       @PostMapping("/get-data")
       ResponseEntity<Object> getTheStatus(@RequestHeader HttpHeaders headers ,@ResponseBody MyData data){
    
              return new ResponseEntity<>("",HttpStatus.BAD_REQUEST);
    
       }
    
    }

【问题讨论】:

    标签: java spring-boot


    【解决方案1】:

    这是因为传递了 HttpStatus.BAD_REQUEST

    【讨论】:

    • 是的...即使参数错误,那么200状态也不应该正确执行函数对吗?问题是当我返回 BAD_REQUEST
    • 当您传递 HttpStatus.BAD_REQUEST 时,它返回 400 的响应。对于正确的响应传递 HttpStatus.OK
    • 如果微服务出现请求错误怎么办?如果我返回 200..,我将如何捕获该响应?
    • 使用 try catch 或 if else 并在捕获错误时传递指定的错误代码。
    【解决方案2】:

    恕我直言,这样返回 4xx 状态不是最好的方法,请改用 @ControllerAdvice

    【讨论】:

      【解决方案3】:

      在 HTTP 上下文响应状态 200 表示成功响应。状态 4xx 和 5xx 代表一些问题。问题可能与请求、连接、服务器或其他来源有关。一些 HTTP 客户端实现(如 RestTemplate)会在状态码不成功的情况下抛出异常因为不成功的响应状态代表执行失败

      如果您想避免异常,可以添加错误处理程序。

      public class RestTemplateResponseErrorHandler 
        implements ResponseErrorHandler {
      
          @Override
          public boolean hasError(ClientHttpResponse httpResponse) throws IOException {
            return false;
          }
      
          @Override
          public void handleError(ClientHttpResponse httpResponse) throws IOException {}
      }
      
      RestTemplate restTemplate = restTemplateBuilder
                .errorHandler(new RestTemplateResponseErrorHandler())
                .build();
      
      template.postForEntity("http://localhost:8090/get-data", body, String.class);
      

      【讨论】:

      • 我想这样执行-> if(response.getStatusCodeValue()==400) {...then do this...} ..我该怎么做?
      • 你可以使用自定义的ResponseErrorHandler。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-25
      • 2011-04-21
      相关资源
      最近更新 更多