Spring引导:返回HTTP响应代码400,嵌套异常为java.io.IOException

Spring引导:返回HTTP响应代码400,嵌套异常为java.io.IOException,java,spring-boot,Java,Spring Boot,考虑下面的代码。在这里,当响应返回的状态代码为200时,代码执行工作正常。 但如果我尝试返回状态代码400,则在指定行捕获异常 *错误响应:中的内部服务器错误:发布请求时的getResponse I/O错误“http://localhost:8090/get-数据“:服务器为URL返回了HTTP响应代码:400:http://localhost:8090/get-数据;嵌套异常为java.io.IOException:服务器为URL返回了HTTP响应代码400:http://localhost:

考虑下面的代码。在这里,当响应返回的状态代码为200时,代码执行工作正常。

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

*错误响应:中的内部服务器错误:发布请求时的getResponse I/O错误“http://localhost:8090/get-数据“:服务器为URL返回了HTTP响应代码:400:http://localhost:8090/get-数据;嵌套异常为java.io.IOException:服务器为URL返回了HTTP响应代码400:http://localhost:8090/get-资料

连接:关闭,内容长度:485,内容类型:application/json,日期:Thu,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);
    
       }
    
    }
@RestController
ABC班{
@自动连线
rest模板;
@邮戳(“……”)
ResponseEntity getResponse(){
反应性反应
试一试{
HttpEntity body=newhttpentity(obj,header);//数据obj&httpheader
响应=模板。postForEntity(“http://localhost:8090/get- 
“数据”,正文,字符串.class);
}捕获(HttpStatusCodeException-ex){
扔。。。。
}捕获(例外情况除外){
抛出内部服务器错误…//此处抛出异常
}       
if(response.getStatusCodeValue()==200){
...
}
...
}
}
@RestController
XYZ类{
@后期映射(“/get data”)
ResponseEntity getTheStatus(@RequestHeader-HttpHeaders-headers,@ResponseBody-MyData-data){
返回新的响应属性(“,HttpStatus.BAD_请求”);
}
}

这是因为通过了HttpStatus。坏请求是因为通过了HttpStatus。坏请求是因为通过了HttpStatus。如果这样返回4xx状态不是最好的方法,请使用
@ControllerAdvice
而不是如果这样返回4xx状态不是最好的方法,在HTTP上下文响应中使用
@ControllerAdvice
代替,状态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);

在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);

对即使参数错误,200状态也不应该正确执行功能,对吗?问题是当我返回BAD_请求时,当您传递HttpStatus.BAD_请求时,它返回400的响应。要获得正确的响应,请传递HttpStatus.ok如果microservice出现请求错误怎么办?如果返回200..,我将如何捕获该响应?如果捕获错误,请使用try catch或if else并传递指定的错误代码。是。。。即使参数错误,200状态也不应该正确执行功能,对吗?问题是当我返回BAD_请求时,当您传递HttpStatus.BAD_请求时,它返回400的响应。要获得正确的响应,请传递HttpStatus.ok如果microservice出现请求错误怎么办?如果返回200..,我将如何捕获该响应?如果捕获错误,请使用try catch或if else并传递指定的错误代码。我希望执行以下操作->if(response.getStatusCodeValue()==400){…然后执行此操作…}…我将如何做?您可以使用自定义ResponseErrorHandler。我希望这样执行->if(response.getStatusCodeValue()==400){…然后执行此…}..我将如何做?您可以使用自定义ResponseErrorHandler。