diff --git a/spring-webflux/src/main/kotlin/org/springframework/web/reactive/function/client/ClientResponseExtensions.kt b/spring-webflux/src/main/kotlin/org/springframework/web/reactive/function/client/ClientResponseExtensions.kt index 7dbfd90554..4672da062b 100644 --- a/spring-webflux/src/main/kotlin/org/springframework/web/reactive/function/client/ClientResponseExtensions.kt +++ b/spring-webflux/src/main/kotlin/org/springframework/web/reactive/function/client/ClientResponseExtensions.kt @@ -16,6 +16,7 @@ package org.springframework.web.reactive.function.client +import kotlinx.coroutines.reactive.awaitFirstOrNull import kotlinx.coroutines.reactive.awaitSingle import org.springframework.core.ParameterizedTypeReference import org.springframework.http.ResponseEntity @@ -67,7 +68,7 @@ inline fun ClientResponse.toEntityList(): Mono() {}) /** - * Coroutines variant of [ClientResponse.bodyToMono]. + * Non-nullable Coroutines variant of [ClientResponse.bodyToMono]. * * @author Sebastien Deleuze * @since 5.2 @@ -75,6 +76,15 @@ inline fun ClientResponse.toEntityList(): Mono ClientResponse.awaitBody(): T = bodyToMono().awaitSingle() +/** + * Nullable coroutines variant of [ClientResponse.bodyToMono]. + * + * @author Sebastien Deleuze + * @since 5.2 + */ +suspend inline fun ClientResponse.awaitBodyOrNull(): T? = + bodyToMono().awaitFirstOrNull() + /** * Coroutines variant of [ClientResponse.toEntity]. * 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 721081c348..be1c883bf0 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 @@ -67,7 +67,7 @@ inline fun WebClient.ResponseSpec.bodyToFlux(): Flux = * @author Sebastien Deleuze * @since 5.2 */ -suspend fun WebClient.RequestHeadersSpec>.awaitResponse(): ClientResponse = +suspend fun WebClient.RequestHeadersSpec>.awaitExchange(): ClientResponse = exchange().awaitSingle() /** diff --git a/spring-webflux/src/main/kotlin/org/springframework/web/reactive/function/server/ServerRequestExtensions.kt b/spring-webflux/src/main/kotlin/org/springframework/web/reactive/function/server/ServerRequestExtensions.kt index 55a635d710..9b8bc4478b 100644 --- a/spring-webflux/src/main/kotlin/org/springframework/web/reactive/function/server/ServerRequestExtensions.kt +++ b/spring-webflux/src/main/kotlin/org/springframework/web/reactive/function/server/ServerRequestExtensions.kt @@ -49,12 +49,21 @@ inline fun ServerRequest.bodyToFlux(): Flux = bodyToFlux(object : ParameterizedTypeReference() {}) /** - * Coroutines variant of [ServerRequest.bodyToMono]. + * Non-nullable Coroutines variant of [ServerRequest.bodyToMono]. * * @author Sebastien Deleuze * @since 5.2 */ -suspend inline fun ServerRequest.awaitBody(): T? = +suspend inline fun ServerRequest.awaitBody(): T = + bodyToMono().awaitSingle() + +/** + * Nullable Coroutines variant of [ServerRequest.bodyToMono]. + * + * @author Sebastien Deleuze + * @since 5.2 + */ +suspend inline fun ServerRequest.awaitBodyOrNull(): T? = bodyToMono().awaitFirstOrNull() /** @@ -81,8 +90,8 @@ suspend fun ServerRequest.awaitMultipartData(): MultiValueMap = * @author Sebastien Deleuze * @since 5.2 */ -suspend fun ServerRequest.awaitPrincipal(): Principal = - principal().awaitSingle() +suspend fun ServerRequest.awaitPrincipal(): Principal? = + principal().awaitFirstOrNull() /** * Coroutines variant of [ServerRequest.session]. diff --git a/spring-webflux/src/test/kotlin/org/springframework/web/reactive/function/client/ClientResponseExtensionsTests.kt b/spring-webflux/src/test/kotlin/org/springframework/web/reactive/function/client/ClientResponseExtensionsTests.kt index 9f90d0f6ed..b762fe7b61 100644 --- a/spring-webflux/src/test/kotlin/org/springframework/web/reactive/function/client/ClientResponseExtensionsTests.kt +++ b/spring-webflux/src/test/kotlin/org/springframework/web/reactive/function/client/ClientResponseExtensionsTests.kt @@ -21,6 +21,7 @@ import io.mockk.mockk import io.mockk.verify import kotlinx.coroutines.runBlocking import org.junit.Assert.assertEquals +import org.junit.Assert.assertNull import org.junit.Test import org.springframework.core.ParameterizedTypeReference import org.springframework.http.HttpStatus @@ -69,6 +70,15 @@ class ClientResponseExtensionsTests { } } + @Test + fun awaitBodyOrNull() { + val response = mockk() + every { response.bodyToMono() } returns Mono.empty() + runBlocking { + assertNull(response.awaitBodyOrNull()) + } + } + @Test fun awaitEntity() { val response = mockk() 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 88d4bacca0..b76339e142 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 @@ -58,11 +58,11 @@ class WebClientExtensionsTests { } @Test - fun awaitResponse() { + fun awaitExchange() { val response = mockk() every { requestBodySpec.exchange() } returns Mono.just(response) runBlocking { - assertEquals(response, requestBodySpec.awaitResponse()) + assertEquals(response, requestBodySpec.awaitExchange()) } } diff --git a/spring-webflux/src/test/kotlin/org/springframework/web/reactive/function/server/ServerRequestExtensionsTests.kt b/spring-webflux/src/test/kotlin/org/springframework/web/reactive/function/server/ServerRequestExtensionsTests.kt index e9912ae425..a6fa2b423c 100644 --- a/spring-webflux/src/test/kotlin/org/springframework/web/reactive/function/server/ServerRequestExtensionsTests.kt +++ b/spring-webflux/src/test/kotlin/org/springframework/web/reactive/function/server/ServerRequestExtensionsTests.kt @@ -61,10 +61,10 @@ class ServerRequestExtensionsTests { } @Test - fun awaitBodyNull() { + fun awaitBodyOrNull() { every { request.bodyToMono() } returns Mono.empty() runBlocking { - assertNull(request.awaitBody()) + assertNull(request.awaitBodyOrNull()) } }