Spring Cloud 1.0.2 和 SR3 RestTemplate 忽略了我的 ResponseErrorHandler
Spring Cloud 1.0.2 and SR3 RestTemplate ignoring my ResponseErrorHandler
使用 Spring Cloud,我无法在使用最新版本的 RestTemplate 上使用自定义 ResponseErrorHandler 来消除抛出的异常。一年前,我们实现了类似于 的东西。这一直有效,直到我们移植到 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
版本。
这是我必须为天使发布列车做的事情:
@Bean
@Qualifier("custom")
public RestTemplate restTemplate(RestTemplateCustomizer customizer) {
RestTemplate restTemplate = new RestTemplate();
restTemplate.setErrorHandler(new ExceptionLessErrorHandler());
customizer.customize(restTemplate); //this brings in ribbon.
return restTemplate;
}
@Autowired
@Qualifier("custom")
RestTemplate rest;
Angel.X 创建一个 RestTemplate
而你得到的是自动创建的,而不是你创建的。
我还创建了 an issue 以使其更加用户友好并记录如何执行此操作。
如果异常是连接问题的结果,则不会调用 ResponseErrorHandler,因为它仅用于响应问题。据我所知,阻止连接问题引发异常的唯一方法是通过 HttpConnectionFactory 添加某种本地主机代理。
使用 Spring Cloud,我无法在使用最新版本的 RestTemplate 上使用自定义 ResponseErrorHandler 来消除抛出的异常。一年前,我们实现了类似于
@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
版本。
这是我必须为天使发布列车做的事情:
@Bean
@Qualifier("custom")
public RestTemplate restTemplate(RestTemplateCustomizer customizer) {
RestTemplate restTemplate = new RestTemplate();
restTemplate.setErrorHandler(new ExceptionLessErrorHandler());
customizer.customize(restTemplate); //this brings in ribbon.
return restTemplate;
}
@Autowired
@Qualifier("custom")
RestTemplate rest;
Angel.X 创建一个 RestTemplate
而你得到的是自动创建的,而不是你创建的。
我还创建了 an issue 以使其更加用户友好并记录如何执行此操作。
如果异常是连接问题的结果,则不会调用 ResponseErrorHandler,因为它仅用于响应问题。据我所知,阻止连接问题引发异常的唯一方法是通过 HttpConnectionFactory 添加某种本地主机代理。