@HttpExchange interface does not resolve return type correctly while using with suspending methods (original) (raw)

Affects: 6.0.7

@HttpExchange annotated methods works as expected for simple return types, but not for generic types. For example a function expected to return List, but HttpServiceProxy resolves it as String.

interface SuspendingService {

@GetExchange suspend fun body(): List }

Here is a test case :

class HttpServiceMethodKotlinTests {

private val EXPECTED_BODY_TYPE: ParameterizedTypeReference<*> = object : ParameterizedTypeReference<List>() {}

private val client = TestHttpClientAdapter() private val proxyFactory = HttpServiceProxyFactory.builder(client).build()

@Test fun suspendingService(): Unit = runBlocking { val service = proxyFactory.createClient(SuspendingService::class.java)

service.body()
getVerifyClientInvocation("requestToBody", EXPECTED_BODY_TYPE)

}

private fun getVerifyClientInvocation(methodName: String, expectedBodyType: ParameterizedTypeReference<*>) { assertThat(client.invokedMethodName).isEqualTo(methodName) assertThat(client.bodyType).isEqualTo(expectedBodyType) }

private interface SuspendingService { @GetExchange suspend fun body(): List } }

Result:

expected: ParameterizedTypeReference<java.util.List<? extends java.lang.String>>
 but was: ParameterizedTypeReference<class java.lang.String>

When you change function signature as fun body(): Mono<List<String>> it returns ParameterizedTypeReference<java.util.List<java.lang.String>> as expected.

As far as i see, Only "suspending methods" affected by it. Flows works as expected.