You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 03:07:40