Spring WebClient как альтернатива RestTemplate - PullRequest
0 голосов
/ 31 октября 2018

Текущий Javadoc состояний RestTemplate:

ПРИМЕЧАНИЕ. Начиная с версии 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>

1 Ответ

0 голосов
/ 31 октября 2018

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

...