- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要在所有 RestTemplate 客户端请求中添加一个自定义 header 。所以我实现了 ClientHttpRequestInterceptor
。然后我在我的 RestTemplateBuilder
配置中添加拦截器,如下所示。问题是,当 RestTemplate 进行 HTTP 调用时,它抛出以下异常:
java.lang.ClassCastException: org.springframework.http.client.InterceptingClientHttpRequestFactory cannot be cast to org.springframework.http.client.HttpComponentsClientHttpRequestFactory
RestTemplate Bean 创建:
@Bean
public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) {
PoolingHttpClientConnectionManager poolingConnectionManager = new PoolingHttpClientConnectionManager();
poolingConnectionManager.setMaxTotal(restTemplateProps.getMaxConnectionsPerPool());
poolingConnectionManager.setDefaultMaxPerRoute(restTemplateProps.getMaxDefaultConnectionPerRoute());
CloseableHttpClient client = HttpClientBuilder.create().setConnectionManager(poolingConnectionManager).build();
ClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(client);
restTemplateBuilder = restTemplateBuilder.additionalInterceptors(new MyClientHttpRequestInterceptor());
return restTemplateBuilder.requestFactory(clientHttpRequestFactory).build();
}
此外,我稍后会在下面的代码中更新超时:
protected void setRestTemplateTimeouts() {
HttpComponentsClientHttpRequestFactory rf =
(HttpComponentsClientHttpRequestFactory) restTemplate.getRequestFactory();
rf.setConnectTimeout(restTemplateProps.getConnectionTimeout());
rf.setReadTimeout(restTemplateProps.getSocketTimeout());
}
谁能帮我解决这个问题?
最佳答案
问题是,我试图在设置 ClientHttpRequestInterceptor
之后设置连接和读取超时。
在我的 setRestTemplateTimeouts()
方法中,当我尝试获取并将 requestFactory
类型转换为 HttpComponentsClientHttpRequestFactory
时,我得到了 ClassCastException
异常,因为 restTemplate.getRequestFactory()
返回 InterceptingClientHttpRequestFactory
而不是 HttpComponentsClientHttpRequestFactory
。这是因为我在我的 restTemplate 对象中添加了一个拦截器。
解决办法是设置超时前设置拦截器,因为设置拦截器后不能设置超时。引用以下代码:
@Bean
public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) {
PoolingHttpClientConnectionManager poolingConnectionManager = new PoolingHttpClientConnectionManager();
poolingConnectionManager.setMaxTotal(restTemplateProps.getMaxConnectionsPerPool());
poolingConnectionManager.setDefaultMaxPerRoute(restTemplateProps.getMaxDefaultConnectionPerRoute());
CloseableHttpClient client = HttpClientBuilder.create().setConnectionManager(poolingConnectionManager).build();
HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(client);
clientHttpRequestFactory.setConnectTimeout(restTemplateProps.getConnectionTimeout());
clientHttpRequestFactory.setReadTimeout(restTemplateProps.getSocketTimeout());
restTemplateBuilder = restTemplateBuilder.additionalInterceptors(new MyClientHttpRequestInterceptor());
return restTemplateBuilder.requestFactory(clientHttpRequestFactory).build();
}
关于java - 使用 HttpComponentsClientHttpRequestFactory 在 RestTemplateBuilder 中添加自定义 ClientHttpRequestInterceptor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49269636/
我的 Spring Boot 应用程序中有下面列出的loggingInterceptor。每当调用 REST 服务时都会调用此拦截器。我看到前 2 个 sysout 语句立即打印,第三个 sysout
我已经为我的自定义日志拦截器完成了以下操作 public class HttpLoggingInterceptor implements ClientHttpRequestInterceptor {
我想使用拦截器将授权 header 添加到通过休息模板发出的每个请求中。我这样做是这样的: public FirebaseCloudMessagingRestTemplate(@Autowired R
我将多个 ClientHttpRequestInterceptor 设置为 RestTemplate (CommonRestTemplateBuilder) 的常用配置,其中之一是 LogReques
我正在将消息级加密 (MLE) 添加到用于传出请求的现有代码库中。为此,我简单地编写了一个拦截器,它将捕获传出的请求,加密它们的主体,然后将请求发送出去。我们得到的响应也是加密的,必须解密。这一切对我
假设我有以下 2 ClientHttpRequestInterceptor s: public class RequestLoggerInterceptor implements ClientHttp
我正在使用 ClientHttpRequestInterceptor 报告 RestTemplate 的请求输出和响应输入。如果出现异常,我需要记录响应,假设模板是否试图用错误的类取消响应。 这是拦截
下面的单元测试失败。我正在打印请求和响应,并且可以确认 MockRestServiceServer 在调用端点时返回模拟的 JSON。当我将测试更改为直接与服务器通信时,单元测试通过。不知道我做错了什
所以我有以下场景要使用 Spring boot rest template 来实现消耗 REST-API (涉及token认证机制)。为了执行测试,我在 Spring Boot 中创建了简单的模拟 R
我需要在所有 RestTemplate 客户端请求中添加一个自定义 header 。所以我实现了 ClientHttpRequestInterceptor。然后我在我的 RestTemplateBui
我使用 @Autowired 访问 Spring MVC Controller 中的 session ,如下所示: @Autowired private HttpSession session; 问题
我正在尝试使用休息服务并且我正在发布一些数据,使用 Spring RestTemplate postForObjectMethod 但是我得到了一个空响应,即使我可以在有效负载中看到请求和响应。 [更
我是一名优秀的程序员,十分优秀!