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>
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

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