根据我的经验,在致电 Spring 之后RestTemplate#exchange
随后收到“404 - Not Found”响应,RestClientException
被抛出而不是返回ResponseEntity
可以检查其状态(即:ResponseEntity#getStatusCode#is4xxClientError
).
我不明白为什么HttpStatus#is4xxClientError
即使存在,如果相反Exception
被抛出,阻止返回ResponseEntity
with HttpStatus
打电话#is4xxClientError
on...
我有理由相信我刚才描述的是实际情况,因为我可以在互联网上找到其他帐户来证实这一点(即:Spring MVC - 当 http 404 发生时 RestTemplate 启动异常 https://stackoverflow.com/questions/16194014/spring-mvc-resttemplate-launch-exception-when-http-404-happens/).
如何使用 Java 代码进入状态RestTemplate
我确实可以在哪里检查ResponseEntity#getStatusCode#is4xxClientError
when RestTemplate#exchange
收到404,而不是被阻止RestClientException
?是不是有什么关系RestTemplate
配置?
或者我是否正确,这实际上是不可能的,也许存在ResponseEntity#getStatusCode#is4xxClientError
实际上是一个“错误”吗?
休息模板有一个方法
public void setErrorHandler(ResponseErrorHandler errorHandler);
And 响应错误处理程序界面看起来像这样。
public interface ResponseErrorHandler {
boolean hasError(ClientHttpResponse response) throws IOException;
void handleError(ClientHttpResponse response) throws IOException;
}
每当休息模板处理响应,它首先调用ResponseErrorHandler#hasError(),如果返回 true,ResponseErrorHandler#handleError()被调用可能会抛出异常。
如果你不设置ResponseErrorHandler#setErrorHandler(),默认为DefaultResponseErrorHandler.java https://github.com/spring-projects/spring-framework/blob/master/spring-web/src/main/java/org/springframework/web/client/DefaultResponseErrorHandler.java.
默认实现将 4xx / 5xx 系列状态代码视为错误并抛出 RestClientException(不是此异常,而是此异常的子类)。
你总是可以写自己的响应错误处理程序并覆盖默认行为。这样你就可以得到一个响应实体对象,即使在 4xx / 5xx 的情况下(通过编写您自己的实现ResponseErrorHandler
并总是回来false
从方法hasError()
).
一旦你有ResponseEntity
对象,您可以使用ResponseEntity#getStatusCode()#is4xxClientError()方法达到同样的目的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)