From 5fe49d869885ac89cfe0e852e6e5d4f1724a47f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Vav=C5=99=C3=ADk?= Date: Mon, 19 Sep 2022 13:30:07 +0200 Subject: [PATCH] RR - Prefer application-supplied provider over a pre-packaged one --- .../deployment/ResteasyReactiveProcessor.java | 4 +- .../reactive/kotlin/AppSuppliedProvider.kt | 53 +++++++++++++++++++ .../reactive/kotlin/SharedResource.kt | 4 +- .../reactive/kotlin/SharedResourceTest.kt | 14 +++++ .../io/quarkus/it/shared/SharedProvider.java | 4 +- 5 files changed, 73 insertions(+), 6 deletions(-) create mode 100644 integration-tests/resteasy-reactive-kotlin/standard/src/main/kotlin/io/quarkus/it/resteasy/reactive/kotlin/AppSuppliedProvider.kt diff --git a/extensions/resteasy-reactive/quarkus-resteasy-reactive/deployment/src/main/java/io/quarkus/resteasy/reactive/server/deployment/ResteasyReactiveProcessor.java b/extensions/resteasy-reactive/quarkus-resteasy-reactive/deployment/src/main/java/io/quarkus/resteasy/reactive/server/deployment/ResteasyReactiveProcessor.java index fdef1620338ee..cc5328a1a7b43 100644 --- a/extensions/resteasy-reactive/quarkus-resteasy-reactive/deployment/src/main/java/io/quarkus/resteasy/reactive/server/deployment/ResteasyReactiveProcessor.java +++ b/extensions/resteasy-reactive/quarkus-resteasy-reactive/deployment/src/main/java/io/quarkus/resteasy/reactive/server/deployment/ResteasyReactiveProcessor.java @@ -707,7 +707,7 @@ public void providersFromClasspath(BuildProducer mes continue; } MessageBodyReaderBuildItem.Builder builder = new MessageBodyReaderBuildItem.Builder( - providerClassName, handledClassName); + providerClassName, handledClassName).setBuiltin(true); Consumes consumes = providerClass.getAnnotation(Consumes.class); if (consumes != null) { builder.setMediaTypeStrings(Arrays.asList(consumes.value())); @@ -725,7 +725,7 @@ public void providersFromClasspath(BuildProducer mes continue; } MessageBodyWriterBuildItem.Builder builder = new MessageBodyWriterBuildItem.Builder( - providerClassName, handledClassName); + providerClassName, handledClassName).setBuiltin(true); Produces produces = providerClass.getAnnotation(Produces.class); if (produces != null) { builder.setMediaTypeStrings(Arrays.asList(produces.value())); diff --git a/integration-tests/resteasy-reactive-kotlin/standard/src/main/kotlin/io/quarkus/it/resteasy/reactive/kotlin/AppSuppliedProvider.kt b/integration-tests/resteasy-reactive-kotlin/standard/src/main/kotlin/io/quarkus/it/resteasy/reactive/kotlin/AppSuppliedProvider.kt new file mode 100644 index 0000000000000..b752ab3362f18 --- /dev/null +++ b/integration-tests/resteasy-reactive-kotlin/standard/src/main/kotlin/io/quarkus/it/resteasy/reactive/kotlin/AppSuppliedProvider.kt @@ -0,0 +1,53 @@ +package io.quarkus.it.resteasy.reactive.kotlin + +import io.quarkus.it.shared.Shared +import java.io.InputStream +import java.io.OutputStream +import java.lang.reflect.Type +import java.nio.charset.StandardCharsets +import javax.ws.rs.Consumes +import javax.ws.rs.Produces +import javax.ws.rs.core.MediaType +import javax.ws.rs.core.MultivaluedMap +import javax.ws.rs.ext.MessageBodyReader +import javax.ws.rs.ext.MessageBodyWriter +import javax.ws.rs.ext.Provider + +@Provider +@Produces("text/plain") +@Consumes("text/plain") +class AppSuppliedProvider : MessageBodyReader, MessageBodyWriter { + + override fun isReadable(p0: Class<*>?, type: Type?, p2: Array?, p3: MediaType?): Boolean { + return Shared::class.java == type + } + + override fun readFrom( + p0: Class?, + p1: Type?, + p2: Array?, + p3: MediaType?, + p4: MultivaluedMap?, + p5: InputStream? + ): Shared { + return Shared("app") + } + + override fun isWriteable(p0: Class<*>?, type: Type?, p2: Array?, p3: MediaType?): Boolean { + return Shared::class.java == type + } + + override fun writeTo( + shared: Shared?, + p1: Class<*>?, + p2: Type?, + p3: Array?, + p4: MediaType?, + p5: MultivaluedMap?, + entityStream: OutputStream? + ) { + entityStream?.write( + String.format("{\"message\": \"app+%s\"}", shared!!.message).toByteArray(StandardCharsets.UTF_8) + ) + } +} diff --git a/integration-tests/resteasy-reactive-kotlin/standard/src/main/kotlin/io/quarkus/it/resteasy/reactive/kotlin/SharedResource.kt b/integration-tests/resteasy-reactive-kotlin/standard/src/main/kotlin/io/quarkus/it/resteasy/reactive/kotlin/SharedResource.kt index 3fd83d25abd4d..56dc8563dd391 100644 --- a/integration-tests/resteasy-reactive-kotlin/standard/src/main/kotlin/io/quarkus/it/resteasy/reactive/kotlin/SharedResource.kt +++ b/integration-tests/resteasy-reactive-kotlin/standard/src/main/kotlin/io/quarkus/it/resteasy/reactive/kotlin/SharedResource.kt @@ -9,8 +9,8 @@ import javax.ws.rs.Produces @Path("/shared") class SharedResource { - @Consumes("application/json") - @Produces("application/json") + @Consumes(value = ["application/json", "text/plain"]) + @Produces(value = ["application/json", "text/plain"]) @POST fun returnAsIs(shared: Shared) = shared } diff --git a/integration-tests/resteasy-reactive-kotlin/standard/src/test/kotlin/io/quarkus/it/resteasy/reactive/kotlin/SharedResourceTest.kt b/integration-tests/resteasy-reactive-kotlin/standard/src/test/kotlin/io/quarkus/it/resteasy/reactive/kotlin/SharedResourceTest.kt index d190a9cf725a1..b34f39628a5ad 100644 --- a/integration-tests/resteasy-reactive-kotlin/standard/src/test/kotlin/io/quarkus/it/resteasy/reactive/kotlin/SharedResourceTest.kt +++ b/integration-tests/resteasy-reactive-kotlin/standard/src/test/kotlin/io/quarkus/it/resteasy/reactive/kotlin/SharedResourceTest.kt @@ -23,4 +23,18 @@ class SharedResourceTest { body(CoreMatchers.`is`("""{"message": "canned+canned"}""")) } } + + @Test + fun testApplicationSuppliedProviderIsPreferred() { + Given { + body("""{ "message": "will not be used" }""") + contentType(ContentType.TEXT) + accept(ContentType.TEXT) + } When { + post("/shared") + } Then { + statusCode(200) + body(CoreMatchers.`is`("""{"message": "app+app"}""")) + } + } } diff --git a/integration-tests/shared-library/src/main/java/io/quarkus/it/shared/SharedProvider.java b/integration-tests/shared-library/src/main/java/io/quarkus/it/shared/SharedProvider.java index 15b188846a15b..ebba660d78ca1 100644 --- a/integration-tests/shared-library/src/main/java/io/quarkus/it/shared/SharedProvider.java +++ b/integration-tests/shared-library/src/main/java/io/quarkus/it/shared/SharedProvider.java @@ -15,8 +15,8 @@ import javax.ws.rs.ext.MessageBodyReader; import javax.ws.rs.ext.MessageBodyWriter; -@Produces("application/json") -@Consumes("application/json") +@Produces({ "application/json", "text/plain" }) +@Consumes({ "application/json", "text/plain" }) public class SharedProvider implements MessageBodyReader, MessageBodyWriter { @Override public boolean isReadable(Class type, Type genericType, Annotation[] annotations, MediaType mediaType) {