Spring Boot如何忽略HttpStatus Exceptions
我正在使用Spring Boot构建应用程序。 这个应用程序是分布式的,这意味着我有多个API相互调用。
我的一个底层服务与数据库交互并使用请求的数据进行响应。 如果对未存在的ID进行了请求,我将使用404 HttpStatus进行响应:
return new ResponseEntity(HttpStatus.NOT_FOUND);
(与某些操作中的400错误相同,或者删除条目时的错误等)。
问题是我有一些其他的Spring Boot应用程序调用这些API,抛出一个org.springframework.web.client.HttpClientErrorException: 404 Not Found
Exception,当他们请求时,在这个例子中是一个不存在的条目。 但404状态代码是有意的,不应该返回此exception(导致我的Hystrix断路器调用其回退function)。
我怎么解决这个问题?
在我的代码中对服务的调用是这样实现的: ResponseEntity data = restTemplate.getForEntity(url, Object.class);
我的RestTemplate设置如下:
private RestTemplate restTemplate = new RestTemplate();
Spring的RestTemplate
使用ResponseErrorHandler
来处理ResponseErrorHandler
中的错误。 此接口提供了一种确定响应是否有错误的方法( ResponseErrorHandler#hasError(ClientHttpResponse)
)以及如何处理它( ResponseErrorHandler#handleError(ClientHttpResponse)
)。
你可以使用RestTemplate
设置RestTemplate
的ResponseErrorHandler
RestTemplate#setErrorHandler(ResponseErrorHandler)
它的javadoc状态
默认情况下,
RestTemplate
使用DefaultResponseErrorHandler
。
这个默认实现
[…]检查
ClientHttpResponse
上的状态代码:任何具有ClientHttpResponse
或ClientHttpResponse
系列的代码都被视为错误。 可以通过重写hasError(HttpStatus)
方法来更改此行为。
如果出现错误,它会抛出您看到的exception。
如果要更改此行为,可以提供自己的ResponseErrorHandler
实现(可能通过覆盖DefaultResponseErrorHandler
),该实现不会将4xx视为错误或不会引发exception。
例如
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 } });
然后,您可以检查getForEntity
返回的ResponseEntity
的状态代码并getForEntity
处理。