我正在使用Spring Boot构建应用程序。这个应用程序是分布式的,这意味着我有多个API可以相互调用。
我的一个底层服务与数据库交互并使用请求的数据进行响应。如果对未存在的ID发出请求,我会回复404 HttpStatus:
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
(与某些操作中的400错误相同,或删除条目时的错误等)。
问题是我有一些其他的Spring Boot应用程序调用这些API,在它们请求时抛出org.springframework.web.client.HttpClientErrorException: 404 Not Found
异常,在这个例子中是一个未发生的条目。但404状态代码是有意的,不应该返回此异常(导致我的Hystrix断路器调用其回退功能)。
我该如何解决这个问题?
在我的代码ResponseEntity<Object> data = restTemplate.getForEntity(url, Object.class);
我的RestTemplate设置如下:
private RestTemplate restTemplate = new RestTemplate();
答案 0 :(得分:12)
Spring RestTemplate
使用ResponseErrorHandler
来处理回复中的错误。此接口提供了一种确定响应是否存在错误(ResponseErrorHandler#hasError(ClientHttpResponse)
)以及如何处理错误(ResponseErrorHandler#handleError(ClientHttpResponse)
)的方法。
您可以将RestTemplate
&#39; s ResponseErrorHandler
设为RestTemplate#setErrorHandler(ResponseErrorHandler)
,其javadoc状态为
默认情况下,
RestTemplate
使用DefaultResponseErrorHandler
。
此默认实现
[...]检查上的状态代码
ClientHttpResponse
:任何带有系列的代码HttpStatus.Series.CLIENT_ERROR
或HttpStatus.Series.SERVER_ERROR
是。{ 被认为是一个错误。可以通过覆盖来更改此行为hasError(HttpStatus)
方法。
如果出现错误,它会抛出您看到的异常。
如果您想要更改此行为,您可以提供自己的ResponseErrorHandler
实施(可能通过覆盖DefaultResponseErrorHandler
),但不会将4xx视为错误或不是抛出异常。
例如
restTemplate.setErrorHandler(new ResponseErrorHandler() {
@Override
public boolean hasError(ClientHttpResponse response) throws IOException {
return false; // or whatever you consider an error
}
@Override
public void handleError(ClientHttpResponse response) throws IOException {
// do nothing, or something
}
});
然后,您可以检查ResponseEntity
返回的getForEntity
的状态代码并自行处理。