使用Spring Cloud,我无法使用最新版本在RestTemplate上使用自定义ResponseErrorHandler消除抛出的异常。一年前,我们实施了类似于How to Ignore HttpStatus Exceptions的内容。这一直有效,直到我们移植到spring boot / cloud 1.0.2及更高版本。在使用Spring Cloud 1.0.2或SR3时,在调试模式下不会触发在发生超时或连接问题时在这些处理程序中设置断点。
@Configuration
class MyConfig {
:
@Bean
public RestTemplate restTemplate() {
RestTemplate toRet = new RestTemplate(httpRequest());
toRet.setErrorHandler(new ExceptionLessErrorHandler());
return toRet;
}
}
ExceptionLessErrorHandler.java
public class ExceptionLessErrorHandler implements ResponseErrorHandler {
@Override
public boolean hasError(ClientHttpResponse response) {
return false;
}
@Override
public void handleError(ClientHttpResponse response) throws IOException {
logger.error("handleError called with {}", response);
// do nothing!
}
}
最后当我们调用时,使用相同的restTemplate(我验证了ErrorHandler设置为ExceptionLessErrorHandler)
@Autowired
private RestTemplate restTemplate;
:
class GetRemoteJsonResponse implements Callable<List<JsonNode>> {
:
@Override
public List<JsonNode> call() {
:
ResponseEntity<String> remoteUsers = restTemplate.getForEntity(URL.toString(), String.class, params);
}
}
由java.net.SocketTimeoutException: connect timed out
触发的异常。这不是我们的端口之前的行为(我们之前使用的是Spring 3.2.4)。
更新。具体说明spring-cloud-starter-parent
<parent>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-parent</artifactId>
<version>Angel.SR3</version>
<!--<version>1.0.2</version>-->
<relativePath />
</parent>
除了这两个版本之外,我还没有尝试过其他spring-cloud-starter-parent
版本。
答案 0 :(得分:2)
如果异常是连接问题的结果,则不会调用ResponseErrorHandler,因为它仅用于响应问题。我知道,阻止连接问题抛出异常的唯一方法是通过HttpConnectionFactory添加某种localhost代理。