Spring RestTemplate:如何到达状态以检查#is4xxClientError,而不是 RestClientException 1st?
Spring RestTemplate: How to reach state to check #is4xxClientError, instead of RestClientException 1st?
根据我的经验,在调用 Spring 的 RestTemplate#exchange
之后收到“404 - Not Found”响应后,抛出 RestClientException
而不是返回 ResponseEntity
可以检查其状态(即:使用 ResponseEntity#getStatusCode#is4xxClientError
)。
我不明白为什么 HttpStatus#is4xxClientError
甚至存在,如果抛出 Exception
阻止返回 ResponseEntity
和 HttpStatus
来调用 #is4xxClientError
在...
我有理由相信我刚才描述的是实际情况,因为我可以在互联网上找到其他帐户来证实这一点(即:)。
如何使用 RestTemplate
进入 Java 代码状态,在 RestTemplate#exchange
收到 404 时我确实可以检查 ResponseEntity#getStatusCode#is4xxClientError
,而不是被RestClientException
?与RestTemplate
配置有关吗?
或者我说得对,实际上不可能,也许 ResponseEntity#getStatusCode#is4xxClientError
的存在实际上是一个 'bug'?
RestTemplate有方法
public void setErrorHandler(ResponseErrorHandler errorHandler);
和ResponseErrorHandler界面看起来像这样。
public interface ResponseErrorHandler {
boolean hasError(ClientHttpResponse response) throws IOException;
void handleError(ClientHttpResponse response) throws IOException;
}
每当 RestTemplate 处理响应时,它首先调用 ResponseErrorHandler#hasError(),如果 returns 为真,ResponseErrorHandler#handleError() 被调用,可能会抛出异常。
如果不设置ResponseErrorHandler#setErrorHandler(),默认为DefaultResponseErrorHandler.java.
默认实现将 4xx / 5xx 系列状态代码视为错误并抛出 RestClientException(不是此异常,而是此异常的子类)。
您始终可以编写自己的 ResponseErrorHandler 并覆盖默认行为。因此,即使在 4xx / 5xx 的情况下,您也可以通过这种方式获得 ResponseEntity 对象(通过编写自己的 ResponseErrorHandler
实现并始终从方法返回 false
hasError()
).
获得 ResponseEntity
对象后,您可以使用 ResponseEntity#getStatusCode()#is4xxClientError() 方法达到相同目的。
根据我的经验,在调用 Spring 的 RestTemplate#exchange
之后收到“404 - Not Found”响应后,抛出 RestClientException
而不是返回 ResponseEntity
可以检查其状态(即:使用 ResponseEntity#getStatusCode#is4xxClientError
)。
我不明白为什么 HttpStatus#is4xxClientError
甚至存在,如果抛出 Exception
阻止返回 ResponseEntity
和 HttpStatus
来调用 #is4xxClientError
在...
我有理由相信我刚才描述的是实际情况,因为我可以在互联网上找到其他帐户来证实这一点(即:)。
如何使用 RestTemplate
进入 Java 代码状态,在 RestTemplate#exchange
收到 404 时我确实可以检查 ResponseEntity#getStatusCode#is4xxClientError
,而不是被RestClientException
?与RestTemplate
配置有关吗?
或者我说得对,实际上不可能,也许 ResponseEntity#getStatusCode#is4xxClientError
的存在实际上是一个 'bug'?
RestTemplate有方法
public void setErrorHandler(ResponseErrorHandler errorHandler);
和ResponseErrorHandler界面看起来像这样。
public interface ResponseErrorHandler {
boolean hasError(ClientHttpResponse response) throws IOException;
void handleError(ClientHttpResponse response) throws IOException;
}
每当 RestTemplate 处理响应时,它首先调用 ResponseErrorHandler#hasError(),如果 returns 为真,ResponseErrorHandler#handleError() 被调用,可能会抛出异常。
如果不设置ResponseErrorHandler#setErrorHandler(),默认为DefaultResponseErrorHandler.java.
默认实现将 4xx / 5xx 系列状态代码视为错误并抛出 RestClientException(不是此异常,而是此异常的子类)。
您始终可以编写自己的 ResponseErrorHandler 并覆盖默认行为。因此,即使在 4xx / 5xx 的情况下,您也可以通过这种方式获得 ResponseEntity 对象(通过编写自己的 ResponseErrorHandler
实现并始终从方法返回 false
hasError()
).
获得 ResponseEntity
对象后,您可以使用 ResponseEntity#getStatusCode()#is4xxClientError() 方法达到相同目的。