如何解决Reactor.netty.http.client.HttpClient作为构建器以使用不同的配置创建多个功能
在这里,我正在使用HttpClient创建一个Web客户端构建器。如何创建HttpClient构建器以在同一httpclient上配置多个配置。例如:在一个函数中,我使用代理创建httpClient,在第二个示例中使用代理和安全性创建。因此,我调用了第一个代理功能,该功能先在httpclient对象之上应用代理,然后再应用安全性,以获得具有代理和安全性的htttpclient对象。但是它没有按预期工作。相反,我遇到了错误
(((TcpClientConnect)((TcpClientBootstrap)((HttpTcpClient)((HttpClientConnect)httpClient).defaultClient).defaultClient).source).provider =找不到本地变量'httpClient'
任何人都可以帮助解决此问题吗?
Class WebClientBuilderConfig{
private HttpClient httpClient;
@Autowired
private ConfigProperties configProperties;
public WebClientBuilderConfig() {
this.httpClient = HttpClient.create();
}
public WebClient.Builder webClientBuilderWithProxy() {
Function<String,String> httpsProxyPassword = username -> configProperties.getHttpsProxyPassword();
this.httpClient.tcpConfiguration(tcpClient -> tcpClient.option(ChannelOption.CONNECT_TIMEOUT_MILLIS,configProperties.getTcpTimeout())
.doOnConnected(conn -> conn.addHandlerLast(new ReadTimeoutHandler(configProperties.getTcpTimeout(),TimeUnit.MILLISECONDS)))
.proxy(proxy -> proxy.type(ProxyProvider.Proxy.HTTP)
.host(configProperties.getHttpsProxyHost())
.port(configProperties.getHttpsProxyPort())
.nonProxyHosts(configProperties.getHttpsNonProxyHost())
.username(configProperties.getHttpsProxyUser())
.password(httpsProxyPassword)))
.wiretap(configProperties.getTcpWireTap());
return WebClient.builder().clientConnector(new ReactorClientHttpConnector(httpClient));
}
public WebClient.Builder webClientBuilderWithSSL() {
**this.webClientBuilderWithProxy();**
// truststore
try {
KeyStore trustStore = KeyStore.getInstance(configProperties.getTrustStoreType());
trustStore.load(new FileInputStream((ResourceUtils.getFile(configProperties.getTrustStorePath()))),configProperties.getTrustStorePassword().toCharArray());
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(trustStore);
SslContext sslContext = SslContextBuilder.forClient().trustManager(trustManagerFactory).build();
httpClient.secure(spec -> spec.sslContext(sslContext));
} catch (Exception e) {
log.warn("Unable to set SSL Context",e);
}
return WebClient.builder().clientConnector(new ReactorClientHttpConnector(this.httpClient));
}
解决方法
配置HttpClient
时,您总是会收到一个新实例,因此在示例中,您应该执行以下操作:
public WebClient.Builder webClientBuilderWithProxy() {
Function<String,String> httpsProxyPassword = username -> configProperties.getHttpsProxyPassword();
HttpClient localClient = this.httpClient.tcpConfiguration(tcpClient -> tcpClient.option(ChannelOption.CONNECT_TIMEOUT_MILLIS,configProperties.getTcpTimeout())
.doOnConnected(conn -> conn.addHandlerLast(new ReadTimeoutHandler(configProperties.getTcpTimeout(),TimeUnit.MILLISECONDS)))
.proxy(proxy -> proxy.type(ProxyProvider.Proxy.HTTP)
.host(configProperties.getHttpsProxyHost())
.port(configProperties.getHttpsProxyPort())
.nonProxyHosts(configProperties.getHttpsNonProxyHost())
.username(configProperties.getHttpsProxyUser())
.password(httpsProxyPassword)))
.wiretap(configProperties.getTcpWireTap());
return WebClient.builder().clientConnector(new ReactorClientHttpConnector(localClient));
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。