Browse Source

Fix ParameterizedTypeReference nullness

This commit ensures that `ParameterizedTypeReference<T>` can accept
nullable types. This is especially useful for Kotlin extension functions
and assertion contracts.

Fixes gh-36477
pull/36466/head
Brian Clozel 2 days ago
parent
commit
bc07a451dc
  1. 2
      spring-core/src/main/java/org/springframework/core/ParameterizedTypeReference.java
  2. 10
      spring-messaging/src/test/kotlin/org/springframework/messaging/rsocket/RSocketRequesterExtensionsTests.kt

2
spring-core/src/main/java/org/springframework/core/ParameterizedTypeReference.java

@ -42,7 +42,7 @@ import org.springframework.util.Assert; @@ -42,7 +42,7 @@ import org.springframework.util.Assert;
* @param <T> the referenced type
* @see <a href="https://gafter.blogspot.nl/2006/12/super-type-tokens.html">Neal Gafter on Super Type Tokens</a>
*/
public abstract class ParameterizedTypeReference<T> {
public abstract class ParameterizedTypeReference<T extends @Nullable Object> {
private final Type type;

10
spring-messaging/src/test/kotlin/org/springframework/messaging/rsocket/RSocketRequesterExtensionsTests.kt

@ -107,35 +107,35 @@ class RSocketRequesterExtensionsTests { @@ -107,35 +107,35 @@ class RSocketRequesterExtensionsTests {
suspend fun retrieveAndAwait() {
val response = "foo"
val retrieveSpec = mockk<RSocketRequester.RetrieveSpec>()
every { retrieveSpec.retrieveMono(match<ParameterizedTypeReference<*>>(stringTypeRefMatcher)) } returns Mono.just("foo")
every { retrieveSpec.retrieveMono(match<ParameterizedTypeReference<String>>(stringTypeRefMatcher)) } returns Mono.just("foo")
assertThat(retrieveSpec.retrieveAndAwait<String>()).isEqualTo(response)
}
@Test
suspend fun retrieveAndAwaitOrNull() {
val retrieveSpec = mockk<RSocketRequester.RetrieveSpec>()
every { retrieveSpec.retrieveMono(match<ParameterizedTypeReference<*>>(stringTypeRefMatcher)) } returns Mono.empty()
every { retrieveSpec.retrieveMono(match<ParameterizedTypeReference<String>>(stringTypeRefMatcher)) } returns Mono.empty()
assertThat(retrieveSpec.retrieveAndAwaitOrNull<String>()).isNull()
}
@Test
suspend fun retrieveFlow() {
val retrieveSpec = mockk<RSocketRequester.RetrieveSpec>()
every { retrieveSpec.retrieveFlux(match<ParameterizedTypeReference<*>>(stringTypeRefMatcher)) } returns Flux.just("foo", "bar")
every { retrieveSpec.retrieveFlux(match<ParameterizedTypeReference<String>>(stringTypeRefMatcher)) } returns Flux.just("foo", "bar")
assertThat(retrieveSpec.retrieveFlow<String>().toList()).contains("foo", "bar")
}
@Test
fun retrieveMono() {
val retrieveSpec = mockk<RSocketRequester.RetrieveSpec>()
every { retrieveSpec.retrieveMono(match<ParameterizedTypeReference<*>>(stringTypeRefMatcher)) } returns Mono.just("foo")
every { retrieveSpec.retrieveMono(match<ParameterizedTypeReference<String>>(stringTypeRefMatcher)) } returns Mono.just("foo")
assertThat(retrieveSpec.retrieveMono<String>().block()).isEqualTo("foo")
}
@Test
fun retrieveFlux() {
val retrieveSpec = mockk<RSocketRequester.RetrieveSpec>()
every { retrieveSpec.retrieveFlux(match<ParameterizedTypeReference<*>>(stringTypeRefMatcher)) } returns Flux.just("foo", "bar")
every { retrieveSpec.retrieveFlux(match<ParameterizedTypeReference<String>>(stringTypeRefMatcher)) } returns Flux.just("foo", "bar")
assertThat(retrieveSpec.retrieveFlux<String>().collectList().block()).contains("foo", "bar")
}
}

Loading…
Cancel
Save