当前位置: 首页 > 知识库问答 >
问题:

Spring WebClient作为RestTemplate的替代品

宋原
2023-03-14

RestTemplate的当前javadoc声明

注:从5.0开始,非阻塞、反应性组织。springframework。网状物反应性。客户WebClient为RestTemplate提供了一种现代化的替代方案,可以有效支持同步和异步以及流式场景。RestTemplate在未来的版本中将被弃用,并且不会添加主要的新功能。

我们正在使用spring boot 2.0.6和spring 5.0.10编写一个新项目。

看到restTemboard将被弃用,我们决定使用新的WebClient,它也应该支持同步调用。但是我找不到任何关于如何实现这一点的留档。

我在下面的代码中使用了block:

ResponseEntity<String> response = webClient.get()
            .uri(url)
            .exchange()
            .flatMap(r -> r.toEntity(String.class))
            .block();

然而,当从spring控制器调用时,这会引发下面的异常

java.lang.IllegalStateException: block()/blockFirst()/blockLast() are blocking, which is not supported in thread

那么到底应该如何以同步的方式使用WebClient呢?

编辑:我的pom。xml如下所示:

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>

共有1个答案

祝允晨
2023-03-14

如果应用程序只使用spring boot starter webflux,则意味着服务器和客户端都将使用spring webflux。在这种情况下,禁止在控制器处理程序中调用block运算符,因为它会阻塞少数几个服务器线程之一,并会产生重要的运行时问题。

如果这背后的主要驱动程序是使用WebClient,那么您可以同时依赖spring boot starter web和spring boot starter webflux。您的Spring Boot应用程序仍将在服务器端使用Spring MVC,并且您可以将WebClient作为客户端使用。在这种情况下,您可以调用block操作符,甚至可以在控制器中使用Flux或Mono作为返回类型,因为Spring MVC支持这一点。您甚至可以在现有的Spring MVC应用程序中逐步引入WebClient。

 类似资料:
  • 问题内容: 在我们公司,我们正在认真研究Java开发/质量保证部门中的产品。我们正在寻找的产品之一是Apache Continuum。 有Continuum经验(最好还有Jenkins经验)的人可以解释一下Apache Continuum的优点和缺点(尤其是关于Jenkins的优点)吗? 我的第一印象是: 优点: 更适合对构建和项目进行分组(从UI角度来看)。 缺点: 没有清晰的仪表板。 一个相对

  • 我正在尝试使用WebClient从外部服务下载文件并将其返回到客户端。在Rest控制器中,我有以下endpoint: 当我尝试击中endpoint时,我得到以下错误: 我已尝试返回

  • 问题内容: 问题 在解决这个问题之后,似乎基于文件或磁盘的实现可能是解决我在此处提到的问题的正确解决方案。精简版: 目前,我已将实施为。 条目以相当固定的速率连续添加到其中。稍后对此进行详细说明。 最终,无论如何,这意味着JVM耗尽了堆空间。 在工作中,(强烈)建议我使用SQLite解决此问题,但是在问了上一个问题之后,我认为数据库不是适合此工作的合适工具。所以- 让我知道这听起来是否疯狂 -我认

  • 问题内容: 这是一个从来没有一个正确答案的问题,我已经在网上搜索了很多次,却找不到解决方案。 它适用于Firefox,Chrome。我的responseText将像Réunion这样返回char,它将显示为奇怪的符号。 我尝试了许多方法,例如编码和解码,在响应文件中设置标头都无效。我没主意了。请帮助某人。 在主文件中,确保设置了内容类型和字符集。 在您的AJAX加载页面中,确保您位于顶部。 问题解

  • 我在WinForm4.0或WPF上做一个客户端项目,问题是我如何在没有SQL server安装的客户端存储我的数据。我将提供我的应用程序的设置,这将由我的客户机运行。客户端无法安装SQL Server。NET中是否存在不需要安装sql或任何其他方式的数据库avaiable?

  • 我正在使用Resttemplate在spring boot项目中构建一个简单的API网关。当我的网关收到来自客户端的请求时,它通过RESTful调用将请求发送到另一个服务,然后将响应传递回客户端。 我的代码片段如下所示: 我每秒大约有100多个请求,我知道Resttemplate是线程安全的。 我的问题是: 做这样的工作可以吗?它会成为瓶颈吗 还有其他建议吗 非常感谢你。