Kaj*_*Kaj 10 java rest spring-mvc spring-boot
我正在使用Spring Boot构建一个应用程序.这个应用程序是分布式的,这意味着我有多个API相互调用.
我的一个底层服务与数据库交互并使用请求的数据进行响应.如果对未存在的ID发出请求,我会回复404 HttpStatus:
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
Run Code Online (Sandbox Code Playgroud)
(与某些操作中的400错误相同,或者删除条目时为204).
问题是我有一些其他的Spring Boot应用程序调用这些API,org.springframework.web.client.HttpClientErrorException: 404 Not Found在他们请求时抛出一个Exception,在这个例子中,是一个不存在的条目.但404状态代码是有意的,不应该返回此异常(导致我的Hystrix断路器调用其回退功能).
我怎么解决这个问题?
在我的代码中实现对服务的调用: ResponseEntity<Object> data = restTemplate.getForEntity(url, Object.class);
我的RestTemplate设置如下:
private RestTemplate restTemplate = new RestTemplate();
Run Code Online (Sandbox Code Playgroud)
Sot*_*lis 14
Spring RestTemplate使用a ResponseErrorHandler来处理响应中的错误.此接口提供了一种确定响应是否有错误(ResponseErrorHandler#hasError(ClientHttpResponse))以及如何处理错误(ResponseErrorHandler#handleError(ClientHttpResponse))的方法.
您可以使用其javadoc状态设置RestTemplate'sResponseErrorHandlerRestTemplate#setErrorHandler(ResponseErrorHandler)
默认情况下,
RestTemplate使用aDefaultResponseErrorHandler.
这个默认实现
[...]检查以下内容的状态代码
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
}
});
Run Code Online (Sandbox Code Playgroud)
然后,您可以检查ResponseEntity返回的状态代码getForEntity并自行处理.
| 归档时间: |
|
| 查看次数: |
4978 次 |
| 最近记录: |