Spring Cloud 1.0.2和SR3 RestTemplate忽略了我的ResponseErrorHandler

时间:2015-11-21 00:42:04

标签: java spring spring-boot spring-cloud

使用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版本。

1 个答案:

答案 0 :(得分:2)

如果异常是连接问题的结果,则不会调用ResponseErrorHandler,因为它仅用于响应问题。我知道,阻止连接问题抛出异常的唯一方法是通过HttpConnectionFactory添加某种localhost代理。