diff --git a/spring-webflux/src/main/kotlin/org/springframework/web/reactive/function/client/WebClientExtensions.kt b/spring-webflux/src/main/kotlin/org/springframework/web/reactive/function/client/WebClientExtensions.kt index 12b13e920bd..d48b0b02076 100644 --- a/spring-webflux/src/main/kotlin/org/springframework/web/reactive/function/client/WebClientExtensions.kt +++ b/spring-webflux/src/main/kotlin/org/springframework/web/reactive/function/client/WebClientExtensions.kt @@ -138,7 +138,16 @@ inline fun WebClient.ResponseSpec.bodyToFlow(): Flow = * @since 5.2 */ suspend inline fun WebClient.ResponseSpec.awaitBody() : T = - bodyToMono().awaitSingle() + when (T::class) { + Unit::class -> awaitBodilessEntity().let { Unit as T } + else -> bodyToMono().awaitSingle() + } + +/** + * Coroutines variant of [WebClient.ResponseSpec.toBodilessEntity]. + */ +suspend fun WebClient.ResponseSpec.awaitBodilessEntity() = + toBodilessEntity().awaitSingle() /** * Extension for [WebClient.ResponseSpec.toEntity] providing a `toEntity()` variant diff --git a/spring-webflux/src/test/kotlin/org/springframework/web/reactive/function/client/WebClientExtensionsTests.kt b/spring-webflux/src/test/kotlin/org/springframework/web/reactive/function/client/WebClientExtensionsTests.kt index f9ace0e04b7..6ab3c58ecdb 100644 --- a/spring-webflux/src/test/kotlin/org/springframework/web/reactive/function/client/WebClientExtensionsTests.kt +++ b/spring-webflux/src/test/kotlin/org/springframework/web/reactive/function/client/WebClientExtensionsTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2002-2020 the original author or authors. + * Copyright 2002-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,6 +27,7 @@ import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import org.reactivestreams.Publisher import org.springframework.core.ParameterizedTypeReference +import org.springframework.http.ResponseEntity import reactor.core.publisher.Flux import reactor.core.publisher.Mono import java.util.concurrent.CompletableFuture @@ -125,6 +126,26 @@ class WebClientExtensionsTests { } } + @Test + fun `awaitBody of type Unit`() { + val spec = mockk() + val entity = mockk>() + every { spec.toBodilessEntity() } returns Mono.just(entity) + runBlocking { + assertThat(spec.awaitBody()).isEqualTo(Unit) + } + } + + @Test + fun awaitBodilessEntity() { + val spec = mockk() + val entity = mockk>() + every { spec.toBodilessEntity() } returns Mono.just(entity) + runBlocking { + assertThat(spec.awaitBodilessEntity()).isEqualTo(entity) + } + } + @Test fun `ResponseSpec#toEntity with reified type parameters`() { responseSpec.toEntity>()