From 5d8ce28544ce5198050f21eff992e7fc4cbc6db4 Mon Sep 17 00:00:00 2001 From: Georgios Andrianakis Date: Fri, 25 Jun 2021 17:12:24 +0300 Subject: [PATCH] Ensure suspend methods in RESTEasy Reactive use the same default media types Fixes: #18145 --- .../KotlinCoroutineIntegrationProcessor.java | 9 ++++++++ .../common/processor/EndpointIndexer.java | 6 +++++- .../kotlin/BlockingCoroutinesTest.java | 2 +- .../reactive/kotlin/GreetingResource.kt | 13 ++++++++++++ .../src/main/resources/application.properties | 2 +- .../reactive/kotlin/GreetingResourceTest.kt | 21 +++++++++++++++++++ .../reactive/kotlin/ReactiveClientTest.kt | 2 ++ 7 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 integration-tests/resteasy-reactive-kotlin/standard/src/main/kotlin/io/quarkus/it/resteasy/reactive/kotlin/GreetingResource.kt create mode 100644 integration-tests/resteasy-reactive-kotlin/standard/src/test/kotlin/io/quarkus/it/resteasy/reactive/kotlin/GreetingResourceTest.kt diff --git a/extensions/resteasy-reactive/quarkus-resteasy-reactive/deployment/src/main/java/io/quarkus/resteasy/reactive/server/deployment/KotlinCoroutineIntegrationProcessor.java b/extensions/resteasy-reactive/quarkus-resteasy-reactive/deployment/src/main/java/io/quarkus/resteasy/reactive/server/deployment/KotlinCoroutineIntegrationProcessor.java index 1861b2374d555..6f266a7e40697 100644 --- a/extensions/resteasy-reactive/quarkus-resteasy-reactive/deployment/src/main/java/io/quarkus/resteasy/reactive/server/deployment/KotlinCoroutineIntegrationProcessor.java +++ b/extensions/resteasy-reactive/quarkus-resteasy-reactive/deployment/src/main/java/io/quarkus/resteasy/reactive/server/deployment/KotlinCoroutineIntegrationProcessor.java @@ -12,6 +12,7 @@ import org.jboss.jandex.MethodInfo; import org.jboss.jandex.Type; import org.jboss.resteasy.reactive.common.model.ResourceMethod; +import org.jboss.resteasy.reactive.common.processor.EndpointIndexer; import org.jboss.resteasy.reactive.common.processor.HashUtil; import org.jboss.resteasy.reactive.server.core.parameters.NullParamExtractor; import org.jboss.resteasy.reactive.server.core.parameters.ParameterExtractor; @@ -106,6 +107,14 @@ public ParameterExtractor handleCustomParameter(Type paramType, Map prims = new HashMap<>(); prims.put(byte.class.getName(), Byte.class.getName()); @@ -468,7 +470,9 @@ private ResourceMethod createResourceMethod(ClassInfo currentClassInfo, ClassInf } } - Type nonAsyncReturnType = getNonAsyncReturnType(currentMethodInfo.returnType()); + Type nonAsyncReturnType = getNonAsyncReturnType(methodContext.containsKey(METHOD_CONTEXT_CUSTOM_RETURN_TYPE_KEY) + ? (Type) methodContext.get(METHOD_CONTEXT_CUSTOM_RETURN_TYPE_KEY) + : currentMethodInfo.returnType()); addWriterForType(additionalWriters, nonAsyncReturnType); String[] produces = extractProducesConsumesValues(currentMethodInfo.annotation(PRODUCES), classProduces); diff --git a/integration-tests/resteasy-reactive-kotlin/prod-mode/src/test/kotlin/io/quarkus/it/resteasy/reactive/kotlin/BlockingCoroutinesTest.java b/integration-tests/resteasy-reactive-kotlin/prod-mode/src/test/kotlin/io/quarkus/it/resteasy/reactive/kotlin/BlockingCoroutinesTest.java index 76039bae847da..941be2a93e3b8 100644 --- a/integration-tests/resteasy-reactive-kotlin/prod-mode/src/test/kotlin/io/quarkus/it/resteasy/reactive/kotlin/BlockingCoroutinesTest.java +++ b/integration-tests/resteasy-reactive-kotlin/prod-mode/src/test/kotlin/io/quarkus/it/resteasy/reactive/kotlin/BlockingCoroutinesTest.java @@ -36,7 +36,7 @@ static class TestEndpoint { @Path("hello") @Blocking - public Object hello(kotlin.coroutines.Continuation cont) { + public Object hello(kotlin.coroutines.Continuation cont) { throw new IllegalStateException("should never be called"); } } diff --git a/integration-tests/resteasy-reactive-kotlin/standard/src/main/kotlin/io/quarkus/it/resteasy/reactive/kotlin/GreetingResource.kt b/integration-tests/resteasy-reactive-kotlin/standard/src/main/kotlin/io/quarkus/it/resteasy/reactive/kotlin/GreetingResource.kt new file mode 100644 index 0000000000000..9cca758710b92 --- /dev/null +++ b/integration-tests/resteasy-reactive-kotlin/standard/src/main/kotlin/io/quarkus/it/resteasy/reactive/kotlin/GreetingResource.kt @@ -0,0 +1,13 @@ +package io.quarkus.it.resteasy.reactive.kotlin + +import javax.ws.rs.GET +import javax.ws.rs.Path + +@Path("/greeting") +class GreetingResource { + + @GET + suspend fun testSuspend() = Greeting("hello") +} + +data class Greeting(val message:String) diff --git a/integration-tests/resteasy-reactive-kotlin/standard/src/main/resources/application.properties b/integration-tests/resteasy-reactive-kotlin/standard/src/main/resources/application.properties index dd8026fcef473..01716e19d4db2 100644 --- a/integration-tests/resteasy-reactive-kotlin/standard/src/main/resources/application.properties +++ b/integration-tests/resteasy-reactive-kotlin/standard/src/main/resources/application.properties @@ -24,4 +24,4 @@ mp.messaging.outgoing.countries-t2-out.value.serializer=org.apache.kafka.common. mp.messaging.incoming.countries-t2-in.connector=smallrye-kafka mp.messaging.incoming.countries-t2-in.topic=countries-t2 mp.messaging.incoming.countries-t2-in.auto.offset.reset=earliest -mp.messaging.incoming.countries-t2-in.value.deserializer=org.apache.kafka.common.serialization.StringDeserializer \ No newline at end of file +mp.messaging.incoming.countries-t2-in.value.deserializer=org.apache.kafka.common.serialization.StringDeserializer diff --git a/integration-tests/resteasy-reactive-kotlin/standard/src/test/kotlin/io/quarkus/it/resteasy/reactive/kotlin/GreetingResourceTest.kt b/integration-tests/resteasy-reactive-kotlin/standard/src/test/kotlin/io/quarkus/it/resteasy/reactive/kotlin/GreetingResourceTest.kt new file mode 100644 index 0000000000000..6beceb9df8f1f --- /dev/null +++ b/integration-tests/resteasy-reactive-kotlin/standard/src/test/kotlin/io/quarkus/it/resteasy/reactive/kotlin/GreetingResourceTest.kt @@ -0,0 +1,21 @@ +package io.quarkus.it.resteasy.reactive.kotlin + +import io.quarkus.test.junit.QuarkusTest +import io.restassured.RestAssured +import io.restassured.http.ContentType +import org.hamcrest.CoreMatchers +import org.junit.jupiter.api.Test + +@QuarkusTest +class GreetingResourceTest { + + @Test + fun testDataClass() { + RestAssured.given() + .`when`()["/greeting"] + .then() + .statusCode(200) + .contentType(ContentType.JSON) + .body("message", CoreMatchers.`is`("hello")) + } +} diff --git a/integration-tests/resteasy-reactive-kotlin/standard/src/test/kotlin/io/quarkus/it/resteasy/reactive/kotlin/ReactiveClientTest.kt b/integration-tests/resteasy-reactive-kotlin/standard/src/test/kotlin/io/quarkus/it/resteasy/reactive/kotlin/ReactiveClientTest.kt index bb0e7043a3135..53441dae23ad2 100644 --- a/integration-tests/resteasy-reactive-kotlin/standard/src/test/kotlin/io/quarkus/it/resteasy/reactive/kotlin/ReactiveClientTest.kt +++ b/integration-tests/resteasy-reactive-kotlin/standard/src/test/kotlin/io/quarkus/it/resteasy/reactive/kotlin/ReactiveClientTest.kt @@ -2,6 +2,7 @@ package io.quarkus.it.resteasy.reactive.kotlin import io.quarkus.test.junit.QuarkusTest import io.restassured.RestAssured +import io.restassured.http.ContentType import org.hamcrest.CoreMatchers import org.junit.jupiter.api.Test @@ -14,6 +15,7 @@ class ReactiveClientTest { .`when`()["/country/name/foo"] .then() .statusCode(200) + .contentType(ContentType.JSON) .body("$.size()", CoreMatchers.`is`(1), "[0].capital", CoreMatchers.`is`("foo-capital")) }