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>
アプリケーションが単にspring-boot-starter-webflux
を使用している場合は、サーバーとクライアントの両方がSpring WebFluxを使用することを意味します。この場合、コントローラーハンドラー内でblock
演算子を呼び出すことは禁止されています。これは、いくつかのサーバースレッドの1つをブロックし、重要なランタイムの問題を作成するためです。
この背後にある主なドライバーがWebClient
を使用することである場合、spring-boot-starter-web
とspring-boot-starter-webflux
の両方に依存できます。 Spring Bootアプリケーションは引き続きサーバー側でSpring MVCを使用し、WebClient
をクライアントとして使用できます。その場合、block
演算子を呼び出すか、Flux
またはMono
をコントローラーの戻り型として使用することもできます Spring MVCがサポートしているため 。 既存のSpring MVCアプリケーションにWebClient
を段階的に導入する も可能です。