Spring RestTemplate:如何到达状态以检查#is4xxClientError,而不是RestClientException 1st?

vdgimpew  于 5个月前  发布在  Spring
关注(0)|答案(1)|浏览(42)

根据我的经验,在调用Spring的RestTemplate#exchange之后,随后收到'404 - Not Found'响应,抛出RestClientException,而不是返回可以检查其状态的ResponseEntity(即:使用ResponseEntity#getStatusCode#is4xxClientError)。
我不明白为什么HttpStatus#is4xxClientError甚至存在,如果不是一个Exception抛出,防止返回一个ResponseEntityHttpStatus调用#is4xxClientError上.
我有理由相信我刚才描述的是实际情况,因为我可以在互联网上找到其他账户来证实这一点(即:Spring MVC - RestTemplate launch exception when http 404 happens)。

**如何在Java代码中使用RestTemplate达到一种状态,在这种状态下,当RestTemplate#exchange接收到404时,我确实可以检查ResponseEntity#getStatusCode#is4xxClientError,而不是被RestClientException阻止?**这与RestTemplate配置有关吗?

或者我是正确的,这实际上是不可能的,也许ResponseEntity#getStatusCode#is4xxClientError的存在实际上是一个'错误'?

ndh0cuux

ndh0cuux1#

RestTemplate有方法

public void setErrorHandler(ResponseErrorHandler errorHandler);

字符串
ResponseErrorPane接口看起来像这样。

public interface ResponseErrorHandler {

    boolean hasError(ClientHttpResponse response) throws IOException;

    void handleError(ClientHttpResponse response) throws IOException;
}


RestTemplate处理响应时,首先调用ResponseErrorTemplate #hasError(),如果返回true,则调用ResponseErrorTemplate #hasError(),可能抛出异常。
如果不设置ResponseErrorPane #setErrorPane(),默认为DefaultResponseErrorHandler.java
默认实现将4xx / 5xx系列状态代码视为错误并抛出RestClientException(不是此异常,而是此异常的子类)。
您可以编写自己的ResponseErrorList并覆盖默认行为。因此,即使在4xx / 5xx的情况下,您也可以获得ResponseEntity对象(通过编写自己的ResponseErrorHandler实现并始终从方法hasError()返回false)。
一旦有了ResponseEntity对象,就可以使用**ResponseEntity#getStatusCode()#is4xxClientError()**方法来达到同样的目的。

相关问题