diff --git a/core/deployment/src/main/java/io/quarkus/deployment/steps/ReflectiveHierarchyStep.java b/core/deployment/src/main/java/io/quarkus/deployment/steps/ReflectiveHierarchyStep.java index 79a62475d4d90..ebb059708390c 100644 --- a/core/deployment/src/main/java/io/quarkus/deployment/steps/ReflectiveHierarchyStep.java +++ b/core/deployment/src/main/java/io/quarkus/deployment/steps/ReflectiveHierarchyStep.java @@ -1,6 +1,7 @@ package io.quarkus.deployment.steps; import java.lang.reflect.Modifier; +import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -33,6 +34,9 @@ public class ReflectiveHierarchyStep { private static final Logger log = Logger.getLogger(ReflectiveHierarchyStep.class); + private static final Set IGNORED_PARAMETERIZED_TYPE_PACKAGE_NAMES = new HashSet<>( + Arrays.asList("java.util", "io.reactivex")); + @Inject List hierarchy; @@ -83,7 +87,9 @@ private void addReflectiveHierarchy(ReflectiveHierarchyBuildItem i, Type type, S addReflectiveHierarchy(i, type.asArrayType().component(), processedReflectiveHierarchies, unindexedClasses); } else if (type instanceof ParameterizedType) { ParameterizedType p = (ParameterizedType) type; - addReflectiveHierarchy(i, p.owner(), processedReflectiveHierarchies, unindexedClasses); + if (!IGNORED_PARAMETERIZED_TYPE_PACKAGE_NAMES.contains(p.name().toString())) { + addClassTypeHierarchy(i, p.name(), processedReflectiveHierarchies, unindexedClasses); + } for (Type arg : p.arguments()) { addReflectiveHierarchy(i, arg, processedReflectiveHierarchies, unindexedClasses); } diff --git a/integration-tests/main/src/main/java/io/quarkus/it/rest/EnvelopeClass.java b/integration-tests/main/src/main/java/io/quarkus/it/rest/EnvelopeClass.java new file mode 100644 index 0000000000000..8ecc4269d8e7e --- /dev/null +++ b/integration-tests/main/src/main/java/io/quarkus/it/rest/EnvelopeClass.java @@ -0,0 +1,14 @@ +package io.quarkus.it.rest; + +public class EnvelopeClass { + + private T content; + + public EnvelopeClass(T content) { + this.content = content; + } + + public T getContent() { + return content; + } +} diff --git a/integration-tests/main/src/main/java/io/quarkus/it/rest/EnvelopeClassResource.java b/integration-tests/main/src/main/java/io/quarkus/it/rest/EnvelopeClassResource.java new file mode 100644 index 0000000000000..72c8c0021f35f --- /dev/null +++ b/integration-tests/main/src/main/java/io/quarkus/it/rest/EnvelopeClassResource.java @@ -0,0 +1,16 @@ +package io.quarkus.it.rest; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; + +@Path("/envelope") +public class EnvelopeClassResource { + + @Path("/payload") + @GET + @Produces("application/json") + public EnvelopeClass payloadClass() { + return new EnvelopeClass<>(new PayloadClass("hello")); + } +} diff --git a/integration-tests/main/src/main/java/io/quarkus/it/rest/PayloadClass.java b/integration-tests/main/src/main/java/io/quarkus/it/rest/PayloadClass.java new file mode 100644 index 0000000000000..03b2bd9dd7f08 --- /dev/null +++ b/integration-tests/main/src/main/java/io/quarkus/it/rest/PayloadClass.java @@ -0,0 +1,14 @@ +package io.quarkus.it.rest; + +public class PayloadClass { + + private final String message; + + public PayloadClass(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} diff --git a/integration-tests/main/src/test/java/io/quarkus/it/main/JaxRSTestCase.java b/integration-tests/main/src/test/java/io/quarkus/it/main/JaxRSTestCase.java index cb6ed6c12df4a..ad753357c63ed 100644 --- a/integration-tests/main/src/test/java/io/quarkus/it/main/JaxRSTestCase.java +++ b/integration-tests/main/src/test/java/io/quarkus/it/main/JaxRSTestCase.java @@ -1,5 +1,6 @@ package io.quarkus.it.main; +import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.isEmptyString; @@ -184,4 +185,10 @@ public void testGzipConfig() throws Exception { .then().statusCode(413); obj.close(); } + + @Test + public void testReturnTypeWithGenericArgument() { + RestAssured.when().get("/envelope/payload").then() + .body(containsString("content"), containsString("hello")); + } }