Spring Boot如何忽略HttpStatus异常

14

我正在使用Spring Boot构建一个应用程序。这个应用程序是分布式的,这意味着我有多个API相互调用。

我的其中一个基础服务与数据库交互并响应所请求的数据。如果对不存在的ID进行请求,则我会响应404 HttpStatus:

我正在使用Spring Boot构建一个应用程序。这个应用程序是分布式的,这意味着我有多个API相互调用。

我的其中一个底层服务与数据库交互,并以所请求的数据作出响应。如果发出对不存在ID的请求,则我将以404 HttpStatus作出响应:

return new ResponseEntity<>(HttpStatus.NOT_FOUND);

在某些操作上出现400错误或删除条目时出现204错误等情况相同。

问题是我有一些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();
1个回答

19
Spring的RestTemplate使用ResponseErrorHandler来处理响应中的错误。该接口提供了一种确定响应是否有错误(ResponseErrorHandler#hasError(ClientHttpResponse))以及如何处理它(ResponseErrorHandler#handleError(ClientHttpResponse))的方法。
您可以使用RestTemplate#setErrorHandler(ResponseErrorHandler)设置RestTemplateResponseErrorHandler,其javadoc说明如下:

默认情况下,RestTemplate使用DefaultResponseErrorHandler

这是默认实现。
ClientHttpResponse上检查状态码:任何具有HttpStatus.Series.CLIENT_ERRORHttpStatus.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
    }
});

你可以检查由getForEntity返回的ResponseEntity的状态码,并自行处理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接