spring-boot 从 2.3.5.RELEASE 升级到 2.4.0 后,在包 reactor.netty.tcp 中找不到 ProxyProvider
After upgrading spring-boot from 2.3.5.RELEASE to 2.4.0, ProxyProvider is not found in the package reactor.netty.tcp
从 Spring 引导版本 2.3.5.RELEASE 升级到 pom.xml 中的 2.4.0 后,无法再导入 class ProxyProvider(import reactor.netty.tcp.ProxyProvider;
).请注意,即使是 Spring Boot 的更高版本(已尝试 2.5.0 和 2.5.2),它也不起作用。
通过检查 Maven 依赖项,我注意到:
- 在版本 2.3.5.RELEASE 中,class 取自
io.projectreactor.netty:reactor-netty:0.9.12.RELEASE
- 在版本 2.4.0 中,class 取自
io.projectreactor.netty:reactor-netty-http:1.0.1
我可以通过检查导入的来源 class reactor.netty.http.client.HttpClient
在 IntelliJ 上找到此信息,尽管如上所述来自两个不同的库,但它适用于两个版本。
你知道如何解决 Spring Boot 2.4.0 以后的编译问题吗?
请注意,我在 Spring Boot 的问题跟踪器中发现了同样的问题,但不幸的是它已关闭,没有给出任何解释:https://github.com/spring-projects/spring-boot/issues/24414 .
进一步说明,这些都是2.3情况下的Netty依赖。5.RELEASE:
当 Spring 引导版本为 2.4.0 时这些:
另请注意,在 pom.xml 中,我在这两种情况下都导入了版本 2.3.5 的依赖项 azure-keyvault-secrets-spring-boot-starter
(但即使使用该库的最新版本也会出现相同的问题, 已移至 https://mvnrepository.com/artifact/com.azure.spring/azure-spring-boot-starter-keyvault-secrets/3.6.0) :
<!-- Azure KeyVault access (password safe) -->
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-keyvault-secrets-spring-boot-starter</artifactId>
<version>${azure.version}</version>
<scope>runtime</scope>
</dependency>
这是使用 ProxyProvider 的代码 class:
HttpClient httpClient = HttpClient.create()
.tcpConfiguration(tcpClient -> (sslContext != null
? tcpClient.secure(sslProviderBuilder -> sslProviderBuilder.sslContext(sslContext))
: tcpClient)
.proxy(proxy -> proxy
.type(ProxyProvider.Proxy.HTTP)
.host(host)
.port(port))
);
我注意到,在我的代码中,方法 tcpConfiguration
在 Spring 引导版本 2.4.0 上被弃用,从而找到了解决方案。然后我试图寻找替代方案,从 post in Github 中,我找到了如何改进代码的提示:https://github.com/reactor/reactor-netty/issues/1397#issuecomment-751976453。它说,简而言之,
Everything that you can configure via HttpClient.tcpConfiguration(), now you can configure using directly methods exposed by HttpClient
对于任何感兴趣的人,我 post 这里是我更新的代码,它与问题中的代码具有相同的逻辑,但没有错误,在 Spring Boot 2.4.0:
HttpClient httpClient = HttpClient.create();
if (sslContext != null) {
httpClient = httpClient.secure(sslContextSpec -> sslContextSpec.sslContext(sslContext));
}
httpClient = httpClient.proxy(typeSpec -> typeSpec.type(ProxyProvider.Proxy.HTTP).host(host).port(port));
在这种情况下,仍然使用 ProxyProvider class,但它来自不同的包:reactor.netty.transport.ProxyProvider
(而不是 reactor.netty.tcp.ProxyProvider
)。
从 Spring 引导版本 2.3.5.RELEASE 升级到 pom.xml 中的 2.4.0 后,无法再导入 class ProxyProvider(import reactor.netty.tcp.ProxyProvider;
).请注意,即使是 Spring Boot 的更高版本(已尝试 2.5.0 和 2.5.2),它也不起作用。
通过检查 Maven 依赖项,我注意到:
- 在版本 2.3.5.RELEASE 中,class 取自
io.projectreactor.netty:reactor-netty:0.9.12.RELEASE
- 在版本 2.4.0 中,class 取自
io.projectreactor.netty:reactor-netty-http:1.0.1
我可以通过检查导入的来源 class reactor.netty.http.client.HttpClient
在 IntelliJ 上找到此信息,尽管如上所述来自两个不同的库,但它适用于两个版本。
你知道如何解决 Spring Boot 2.4.0 以后的编译问题吗?
请注意,我在 Spring Boot 的问题跟踪器中发现了同样的问题,但不幸的是它已关闭,没有给出任何解释:https://github.com/spring-projects/spring-boot/issues/24414 .
进一步说明,这些都是2.3情况下的Netty依赖。5.RELEASE:
当 Spring 引导版本为 2.4.0 时这些:
另请注意,在 pom.xml 中,我在这两种情况下都导入了版本 2.3.5 的依赖项 azure-keyvault-secrets-spring-boot-starter
(但即使使用该库的最新版本也会出现相同的问题, 已移至 https://mvnrepository.com/artifact/com.azure.spring/azure-spring-boot-starter-keyvault-secrets/3.6.0) :
<!-- Azure KeyVault access (password safe) -->
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-keyvault-secrets-spring-boot-starter</artifactId>
<version>${azure.version}</version>
<scope>runtime</scope>
</dependency>
这是使用 ProxyProvider 的代码 class:
HttpClient httpClient = HttpClient.create()
.tcpConfiguration(tcpClient -> (sslContext != null
? tcpClient.secure(sslProviderBuilder -> sslProviderBuilder.sslContext(sslContext))
: tcpClient)
.proxy(proxy -> proxy
.type(ProxyProvider.Proxy.HTTP)
.host(host)
.port(port))
);
我注意到,在我的代码中,方法 tcpConfiguration
在 Spring 引导版本 2.4.0 上被弃用,从而找到了解决方案。然后我试图寻找替代方案,从 post in Github 中,我找到了如何改进代码的提示:https://github.com/reactor/reactor-netty/issues/1397#issuecomment-751976453。它说,简而言之,
Everything that you can configure via HttpClient.tcpConfiguration(), now you can configure using directly methods exposed by HttpClient
对于任何感兴趣的人,我 post 这里是我更新的代码,它与问题中的代码具有相同的逻辑,但没有错误,在 Spring Boot 2.4.0:
HttpClient httpClient = HttpClient.create();
if (sslContext != null) {
httpClient = httpClient.secure(sslContextSpec -> sslContextSpec.sslContext(sslContext));
}
httpClient = httpClient.proxy(typeSpec -> typeSpec.type(ProxyProvider.Proxy.HTTP).host(host).port(port));
在这种情况下,仍然使用 ProxyProvider class,但它来自不同的包:reactor.netty.transport.ProxyProvider
(而不是 reactor.netty.tcp.ProxyProvider
)。