Spring WebClient как альтернатива RestTemplate

Текущий 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>
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
7
0
12 316
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если ваше приложение просто использует 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. Работает сейчас. Спасибо!

Ramona Cristea 31.10.2018 15:00

Нужно ли добавить spring-boot-starter-web для использования синхронного WebClient? Кажется, я могу использовать синхронный WebClient, не добавляя его.

mazend 03.03.2021 09:28

Ох .. нам все еще нужен spring-boot-starter-we, чтобы использовать синхронный WebClient. и похоже, что spring-cloud-starter-netflix-eureka-server включает spring-boot-starter-web, так что .. Я неправильно понял.

mazend 04.03.2021 05:27

Другие вопросы по теме