web-dev-qa-db-ja.com

RestTemplateの代替としてのSpring WebClient

RestTemplateの現在のjavadocは次のように述べています。

注:5.0以降、非ブロッキングのリアクティブなorg.springframework.web.reactive.client.WebClientは、同期と非同期の両方、およびストリーミングシナリオを効率的にサポートするRestTemplateの最新の代替手段を提供します。 RestTemplateは将来のバージョンで非推奨となり、今後追加される主要な新機能はありません。

Spring Boot 2.0.6とSpring 5.0.10を使用して新しいプロジェクトを作成しています。

RestTemplateが非推奨になることを考慮して、同期呼び出しもサポートする新しいWebClientを使用することにしました。しかし、それをどのように達成すべきかについてのドキュメントは見つかりませんでした。

以下のコードのように、これにブロックを使用しました:

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

ただし、これは、スプリングコントローラーから呼び出されたときに以下の例外をスローします

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>
4
Ramona Cristea

アプリケーションが単にspring-boot-starter-webfluxを使用している場合は、サーバーとクライアントの両方がSpring WebFluxを使用することを意味します。この場合、コントローラーハンドラー内でblock演算子を呼び出すことは禁止されています。これは、いくつかのサーバースレッドの1つをブロックし、重要なランタイムの問題を作成するためです。

この背後にある主なドライバーがWebClientを使用することである場合、spring-boot-starter-webspring-boot-starter-webfluxの両方に依存できます。 Spring Bootアプリケーションは引き続きサーバー側でSpring MVCを使用し、WebClientをクライアントとして使用できます。その場合、block演算子を呼び出すか、FluxまたはMonoをコントローラーの戻り型として使用することもできます Spring MVCがサポートしているため既存のSpring MVCアプリケーションにWebClientを段階的に導入する も可能です。

5
Brian Clozel