Текущий javadoc RestTemplate гласит:
NOTE: As of 5.0, the non-blocking, reactive org.springframework.web.reactive.client.WebClient offers a modern alternative to the RestTemplate with efficient support for both sync and async, as well as streaming scenarios. The RestTemplate will be deprecated in a future version and will not have major new features added going forward.
Мы пишем новый проект, используя 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();
Однако это вызывает исключение ниже при вызове из контроллера 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>




Если ваше приложение просто использует 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 поддерживает это. Можно даже постепенно вводить WebClient в существующее приложение Spring MVC.
Нужно ли добавить spring-boot-starter-web для использования синхронного WebClient? Кажется, я могу использовать синхронный WebClient, не добавляя его.
Ох .. нам все еще нужен spring-boot-starter-we, чтобы использовать синхронный WebClient. и похоже, что spring-cloud-starter-netflix-eureka-server включает spring-boot-starter-web, так что .. Я неправильно понял.
Значит, виноват отсутствующий
spring-boot-starter-web. Работает сейчас. Спасибо!