Spring Boot如何忽略HttpStatus Exceptions

时间:2015-09-30 14:38:57

标签: java rest spring-mvc spring-boot

我正在使用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();

1 个答案:

答案 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_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
    }
});

然后,您可以检查ResponseEntity返回的getForEntity的状态代码并自行处理。