RestTemplate是否兼容Spring Boot 3?升级阻塞问题及容器疑问
Spring Boot 3 升级与 RestTemplate 兼容问题解答
核心结论
RestTemplate 完全兼容 Spring Boot 3,你遇到的错误并非来自RestTemplate本身,而是因为在Reactor非阻塞线程(如reactor-http-nio-2)中执行了阻塞操作(比如调用RestTemplate的阻塞方法,或是使用WebClient时调用了block()/blockFirst()/blockLast())。
关于容器自动切换的问题
Spring Boot 3 默认仍使用 Tomcat 作为 Servlet 容器,不会自动切换到 Jetty 或 Undertow。只有当你主动排除 Tomcat 依赖,并引入 Jetty/Undertow 的 starter 依赖时,容器才会变更。
解决方案
方案1:保留 RestTemplate 继续使用
如果不想大规模重写代码,可以通过以下方式规避阻塞错误:
- 避免在 Reactor 线程中调用阻塞方法:将 RestTemplate 的调用逻辑迁移到传统 Servlet 线程(比如标准的 Spring MVC 控制器方法),这类线程本身就是为阻塞操作设计的。
- 使用异步线程池执行阻塞调用:通过
@Async注解将 RestTemplate 调用封装到单独的线程池,隔离阻塞操作与非阻塞线程。 - 临时允许 Reactor 线程阻塞(不推荐):通过配置
reactor.blockhound.enabled=false关闭 BlockHound 检查,但这会破坏非阻塞模型的性能优势,仅适合临时调试。
方案2:逐步迁移到 WebClient
如果要适配 Spring Boot 3 的非阻塞生态,推荐逐步替换为 WebClient,但需避免使用 block() 类方法,改用 Reactor 的异步链式调用:
// 示例:非阻塞的 WebClient 调用 webClient.get() .uri("https://example.com/api") .retrieve() .bodyToMono(YourResponse.class) .subscribe(response -> { // 处理响应的异步逻辑 });
错误原因说明
你遇到的错误日志本质是 BlockHound(Spring Boot 3 默认启用的阻塞检测工具)禁止在非阻塞线程中执行阻塞操作,防止破坏响应式性能:
java.lang.IllegalStateException: block()/blockFirst()/blockLast() are blocking, which is not supported in thread reactor-http-nio-2 at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:83) ~[reactor-core-3.4.3.jar:3.4.3] Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
内容的提问来源于stack exchange,提问作者user18876695
相关产品推荐
相关产品推荐

