gpt4 book ai didi

java - Spring Boot 如何忽略 HttpStatus 异常

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:14:00 25 4
gpt4 key购买 nike

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

我的一项底层服务与数据库交互并响应请求的数据。如果发出对不存在的 ID 的请求,我将使用 404 HttpStatus 进行响应:

return new ResponseEntity<>(HttpStatus.NOT_FOUND);

(与某些操作的 400 错误或删除条目等的 204 错误相同)。

问题是我有一些调用这些 API 的其他 Spring Boot 应用程序,抛出 org.springframework.web.client.HttpClientErrorException: 404 Not Found在此示例中,当他们请求不存在的条目时出现异常。但是 404 状态代码是有意的,不应返回此异常(导致我的 Hystrix 断路器调用其回退函数)。

我该如何解决这个问题?

对服务的调用在我的代码中是这样实现的:ResponseEntity<Object> data = restTemplate.getForEntity(url, Object.class);

我的 RestTemplate 是这样设置的:

private RestTemplate restTemplate = new RestTemplate();

最佳答案

Spring 的RestTemplate使用 ResponseErrorHandler 来处理响应中的错误。此接口(interface)提供了一种方法来确定响应是否有错误 (ResponseErrorHandler#hasError(ClientHttpResponse)) 以及如何处理它 (ResponseErrorHandler#handleError(ClientHttpResponse))。

您可以使用 RestTemplate#setErrorHandler(ResponseErrorHandler) 设置 RestTemplateResponseErrorHandler其 javadoc 状态

By default, RestTemplate uses a DefaultResponseErrorHandler.

默认实现

[...] checks for the status code on the ClientHttpResponse: any code with series HttpStatus.Series.CLIENT_ERROR or HttpStatus.Series.SERVER_ERROR is considered to be an error. This behavior can be changed by overriding the hasError(HttpStatus) method.

如果出现错误,它会抛出您所看到的异常。

如果你想改变这个行为,你可以提供你自己的 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的状态码,自己处理。

关于java - Spring Boot 如何忽略 HttpStatus 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32868970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com