Spring Resttemplate 异常处理

新手上路,请多包涵

下面是代码片段;基本上,当错误代码不是 200 时,我试图传播异常。

 ResponseEntity<Object> response = restTemplate.exchange(url.toString().replace("{version}", version),
                    HttpMethod.POST, entity, Object.class);
            if(response.getStatusCode().value()!= 200){
                logger.debug("Encountered Error while Calling API");
                throw new ApplicationException();
            }

但是,如果服务器发出 500 响应,我会收到异常

org.springframework.web.client.HttpServerErrorException: 500 Internal Server Error
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:94) ~[spring-web-4.2.3.RELEASE.jar:4.2.3.RELEASE]

我真的需要在 try 中包装其余的模板交换方法吗?那么代码的目的是什么?

原文由 vaibhav 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 967
2 个回答

你想创建一个实现 ResponseErrorHandler 的类,然后使用它的一个实例来设置你的 rest 模板的错误处理:

 public class MyErrorHandler implements ResponseErrorHandler {
  @Override
  public void handleError(ClientHttpResponse response) throws IOException {
    // your error handling here
  }

  @Override
  public boolean hasError(ClientHttpResponse response) throws IOException {
     ...
  }
}

[...]

public static void main(String args[]) {
  RestTemplate restTemplate = new RestTemplate();
  restTemplate.setErrorHandler(new MyErrorHandler());
}

此外,Spring 有类 DefaultResponseErrorHandler ,您可以扩展它而不是实现接口,以防您只想覆盖 handleError 方法。

 public class MyErrorHandler extends DefaultResponseErrorHandler {
  @Override
  public void handleError(ClientHttpResponse response) throws IOException {
    // your error handling here
  }
}

查看它的 源代码,了解 Spring 如何处理 HTTP 错误。

原文由 carcaret 发布,翻译遵循 CC BY-SA 4.0 许可协议

Spring 巧妙地将 http 错误代码视为异常,并假定您的异常处理代码具有处理错误的上下文。要让 exchange 像您期望的那样运行,请执行以下操作:

     try {
        return restTemplate.exchange(url, httpMethod, httpEntity, String.class);
    } catch(HttpStatusCodeException e) {
        return ResponseEntity.status(e.getRawStatusCode()).headers(e.getResponseHeaders())
                .body(e.getResponseBodyAsString());
    }

这将从响应返回所有预期结果。

原文由 austin cherlo 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题