Spring引导:返回HTTP响应代码400,嵌套异常为java.io.IOException
考虑下面的代码。在这里,当响应返回的状态代码为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时为什么会引发异常?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:
@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。