Skip to content

Commit

Permalink
RR - Prefer application-supplied provider over a pre-packaged one
Browse files Browse the repository at this point in the history
  • Loading branch information
michalvavrik committed Sep 19, 2022
1 parent 617503e commit 5fe49d8
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 6 deletions.
Expand Up @@ -707,7 +707,7 @@ public void providersFromClasspath(BuildProducer<MessageBodyReaderBuildItem> 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()));
Expand All @@ -725,7 +725,7 @@ public void providersFromClasspath(BuildProducer<MessageBodyReaderBuildItem> 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()));
Expand Down
@@ -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<Shared>, MessageBodyWriter<Shared> {

override fun isReadable(p0: Class<*>?, type: Type?, p2: Array<out Annotation>?, p3: MediaType?): Boolean {
return Shared::class.java == type
}

override fun readFrom(
p0: Class<Shared>?,
p1: Type?,
p2: Array<out Annotation>?,
p3: MediaType?,
p4: MultivaluedMap<String, String>?,
p5: InputStream?
): Shared {
return Shared("app")
}

override fun isWriteable(p0: Class<*>?, type: Type?, p2: Array<out Annotation>?, p3: MediaType?): Boolean {
return Shared::class.java == type
}

override fun writeTo(
shared: Shared?,
p1: Class<*>?,
p2: Type?,
p3: Array<out Annotation>?,
p4: MediaType?,
p5: MultivaluedMap<String, Any>?,
entityStream: OutputStream?
) {
entityStream?.write(
String.format("{\"message\": \"app+%s\"}", shared!!.message).toByteArray(StandardCharsets.UTF_8)
)
}
}
Expand Up @@ -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
}
Expand Up @@ -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"}"""))
}
}
}
Expand Up @@ -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<Shared>, MessageBodyWriter<Shared> {
@Override
public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
Expand Down

0 comments on commit 5fe49d8

Please sign in to comment.