From a1d134b0867b52fd2defae706e4b7c4d82b60165 Mon Sep 17 00:00:00 2001 From: mplain Date: Wed, 4 Nov 2020 12:08:56 +0300 Subject: [PATCH] Add missing Kotlin extensions for WebClient.ResponseSpec Closes gh-26030 --- .../function/client/WebClientExtensions.kt | 31 +++++++++++++++++++ .../client/WebClientExtensionsTests.kt | 18 +++++++++++ 2 files changed, 49 insertions(+) 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 b773e06e30..12b13e920b 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 @@ -25,6 +25,7 @@ import kotlinx.coroutines.reactor.asFlux import kotlinx.coroutines.reactor.mono import org.reactivestreams.Publisher import org.springframework.core.ParameterizedTypeReference +import org.springframework.http.ResponseEntity import org.springframework.web.reactive.function.client.WebClient.RequestBodySpec import org.springframework.web.reactive.function.client.WebClient.RequestHeadersSpec import reactor.core.publisher.Flux @@ -138,3 +139,33 @@ inline fun WebClient.ResponseSpec.bodyToFlow(): Flow = */ suspend inline fun WebClient.ResponseSpec.awaitBody() : T = bodyToMono().awaitSingle() + +/** + * Extension for [WebClient.ResponseSpec.toEntity] providing a `toEntity()` variant + * leveraging Kotlin reified type parameters. This extension is not subject to type + * erasure and retains actual generic type arguments. + * + * @since 5.3.2 + */ +inline fun WebClient.ResponseSpec.toEntity(): Mono> = + toEntity(object : ParameterizedTypeReference() {}) + +/** + * Extension for [WebClient.ResponseSpec.toEntityList] providing a `toEntityList()` variant + * leveraging Kotlin reified type parameters. This extension is not subject to type + * erasure and retains actual generic type arguments. + * + * @since 5.3.2 + */ +inline fun WebClient.ResponseSpec.toEntityList(): Mono>> = + toEntityList(object : ParameterizedTypeReference() {}) + +/** + * Extension for [WebClient.ResponseSpec.toEntityFlux] providing a `toEntityFlux()` variant + * leveraging Kotlin reified type parameters. This extension is not subject to type + * erasure and retains actual generic type arguments. + * + * @since 5.3.2 + */ +inline fun WebClient.ResponseSpec.toEntityFlux(): Mono>> = + toEntityFlux(object : ParameterizedTypeReference() {}) 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 cff9e8edce..f9ace0e04b 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 @@ -125,5 +125,23 @@ class WebClientExtensionsTests { } } + @Test + fun `ResponseSpec#toEntity with reified type parameters`() { + responseSpec.toEntity>() + verify { responseSpec.toEntity(object : ParameterizedTypeReference>() {}) } + } + + @Test + fun `ResponseSpec#toEntityList with reified type parameters`() { + responseSpec.toEntityList>() + verify { responseSpec.toEntityList(object : ParameterizedTypeReference>() {}) } + } + + @Test + fun `ResponseSpec#toEntityFlux with reified type parameters`() { + responseSpec.toEntityFlux>() + verify { responseSpec.toEntityFlux(object : ParameterizedTypeReference>() {}) } + } + class Foo }