Skip to content

Commit 85a8868

Browse files
wushiyuanmaimobsdeleuze
authored andcommitted
Preserve generic type info in awaitEntity()
awaitEntity() used T::class.java which erases generic type information (e.g. List<Foo> becomes just List). Use the reified toEntity<T>() extension instead, which preserves full generic type via ParameterizedTypeReference. Closes gh-36834 Signed-off-by: wushiyuanmaimob <wushiyuanwork@outlook.com>
1 parent dd72b9e commit 85a8868

2 files changed

Lines changed: 11 additions & 3 deletions

File tree

spring-webflux/src/main/kotlin/org/springframework/web/reactive/function/client/WebClientExtensions.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ inline fun <reified T : Any> WebClient.ResponseSpec.toEntityFlux(): Mono<Respons
236236
suspend inline fun <reified T : Any> WebClient.ResponseSpec.awaitEntity(): ResponseEntity<T> {
237237
val context = currentCoroutineContext().minusKey(Job.Key)
238238
return withContext(context.toReactorContext()) {
239-
toEntity(T::class.java).awaitSingle()
239+
toEntity<T>().awaitSingle()
240240
}
241241
}
242242

spring-webflux/src/test/kotlin/org/springframework/web/reactive/function/client/WebClientExtensionsTests.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,14 @@ class WebClientExtensionsTests {
219219
verify { responseSpec.toEntityFlux(object : ParameterizedTypeReference<List<Foo>>() {}) }
220220
}
221221

222+
@Test
223+
suspend fun `awaitEntity preserves generic type information`() {
224+
val spec = mockk<WebClient.ResponseSpec>()
225+
val entity = mockk<ResponseEntity<List<Foo>>>()
226+
every { spec.toEntity(any<ParameterizedTypeReference<List<Foo>>>()) } returns Mono.just(entity)
227+
assertThat(spec.awaitEntity<List<Foo>>()).isEqualTo(entity)
228+
}
229+
222230
@Test
223231
fun `ResponseSpec#awaitEntity with coroutine context propagation`() {
224232
val exchangeFunction = mockk<ExchangeFunction>()
@@ -230,7 +238,7 @@ class WebClientExtensionsTests {
230238
every { mockResponse.statusCode() } returns HttpStatus.OK
231239
every { mockResponse.headers() } returns mockClientHeaders
232240
every { mockClientHeaders.asHttpHeaders() } returns HttpHeaders()
233-
every { mockResponse.bodyToMono(Foo::class.java) } returns Mono.just(foo)
241+
every { mockResponse.bodyToMono(any<ParameterizedTypeReference<Foo>>()) } returns Mono.just(foo)
234242
runBlocking(FooContextElement(foo)) {
235243
val responseEntity = WebClient.builder()
236244
.exchangeFunction(exchangeFunction)
@@ -258,7 +266,7 @@ class WebClientExtensionsTests {
258266
every { mockResponse.statusCode() } returns HttpStatus.OK
259267
every { mockResponse.headers() } returns mockClientHeaders
260268
every { mockClientHeaders.asHttpHeaders() } returns HttpHeaders()
261-
every { mockResponse.bodyToMono(Foo::class.java) } returns Mono.just(foo)
269+
every { mockResponse.bodyToMono(any<ParameterizedTypeReference<Foo>>()) } returns Mono.just(foo)
262270
runBlocking {
263271
val responseEntity = WebClient.builder()
264272
.exchangeFunction(exchangeFunction)

0 commit comments

Comments
 (0)