From 3ca61b6d7704c1dd22446ad92e8d34290374bb5e Mon Sep 17 00:00:00 2001 From: Manyanda Chitimbo Date: Tue, 24 Sep 2019 00:06:41 +0200 Subject: [PATCH] feat(rest-json): emits a warning during build time if we detect the need of a json extension and none is provided. Fixes #4157 --- .../io/quarkus/deployment/Capabilities.java | 1 + .../deployment/ResteasyCommonProcessor.java | 48 +++++++++++++++++-- .../deployment/ResteasyJacksonProcessor.java | 3 +- .../deployment/ResteasyJsonbProcessor.java | 3 +- extensions/resteasy/deployment/pom.xml | 2 +- 5 files changed, 50 insertions(+), 7 deletions(-) diff --git a/core/deployment/src/main/java/io/quarkus/deployment/Capabilities.java b/core/deployment/src/main/java/io/quarkus/deployment/Capabilities.java index 4ee190a9192ea..a867ada50d743 100644 --- a/core/deployment/src/main/java/io/quarkus/deployment/Capabilities.java +++ b/core/deployment/src/main/java/io/quarkus/deployment/Capabilities.java @@ -12,6 +12,7 @@ public final class Capabilities extends SimpleBuildItem { public static final String CDI_ARC = "io.quarkus.cdi"; public static final String SERVLET = "io.quarkus.servlet"; public static final String TRANSACTIONS = "io.quarkus.transactions"; + public static final String RESTEASY_JSON_EXTENSION = "resteasy-json-extension"; private final Set capabilities; diff --git a/extensions/resteasy-common/deployment/src/main/java/io/quarkus/resteasy/common/deployment/ResteasyCommonProcessor.java b/extensions/resteasy-common/deployment/src/main/java/io/quarkus/resteasy/common/deployment/ResteasyCommonProcessor.java index 96401a08dce22..6f3342e058066 100644 --- a/extensions/resteasy-common/deployment/src/main/java/io/quarkus/resteasy/common/deployment/ResteasyCommonProcessor.java +++ b/extensions/resteasy-common/deployment/src/main/java/io/quarkus/resteasy/common/deployment/ResteasyCommonProcessor.java @@ -1,5 +1,6 @@ package io.quarkus.resteasy.common.deployment; +import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.List; @@ -8,9 +9,18 @@ import javax.ws.rs.Consumes; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; -import javax.ws.rs.ext.*; - -import org.jboss.jandex.*; +import javax.ws.rs.ext.ContextResolver; +import javax.ws.rs.ext.MessageBodyReader; +import javax.ws.rs.ext.MessageBodyWriter; +import javax.ws.rs.ext.Providers; + +import org.jboss.jandex.AnnotationInstance; +import org.jboss.jandex.AnnotationTarget; +import org.jboss.jandex.AnnotationValue; +import org.jboss.jandex.DotName; +import org.jboss.jandex.IndexView; +import org.jboss.jandex.MethodInfo; +import org.jboss.logging.Logger; import org.jboss.resteasy.core.MediaTypeMap; import org.jboss.resteasy.plugins.interceptors.AcceptEncodingGZIPFilter; import org.jboss.resteasy.plugins.interceptors.GZIPDecodingInterceptor; @@ -18,6 +28,7 @@ import org.jboss.resteasy.plugins.providers.StringTextStar; import io.quarkus.arc.deployment.BeanArchiveIndexBuildItem; +import io.quarkus.deployment.Capabilities; import io.quarkus.deployment.annotations.BuildProducer; import io.quarkus.deployment.annotations.BuildStep; import io.quarkus.deployment.builditem.CombinedIndexBuildItem; @@ -29,6 +40,7 @@ import io.quarkus.runtime.configuration.MemorySize; public class ResteasyCommonProcessor { + private static final Logger LOGGER = Logger.getLogger(ResteasyCommonProcessor.class.getName()); private static final ProviderDiscoverer[] PROVIDER_DISCOVERERS = { new ProviderDiscoverer(ResteasyDotNames.GET, false, true), @@ -81,12 +93,13 @@ void setupGzipProviders(BuildProducer providers) JaxrsProvidersToRegisterBuildItem setupProviders(BuildProducer reflectiveClass, CombinedIndexBuildItem indexBuildItem, BeanArchiveIndexBuildItem beanArchiveIndexBuildItem, - List contributedProviderBuildItems) throws Exception { + List contributedProviderBuildItems, Capabilities capabilities) throws Exception { Set contributedProviders = new HashSet<>(); for (ResteasyJaxrsProviderBuildItem contributedProviderBuildItem : contributedProviderBuildItems) { contributedProviders.add(contributedProviderBuildItem.getName()); } + for (AnnotationInstance i : indexBuildItem.getIndex().getAnnotations(ResteasyDotNames.PROVIDER)) { if (i.target().kind() == AnnotationTarget.Kind.CLASS) { contributedProviders.add(i.target().asClass().name().toString()); @@ -107,6 +120,18 @@ JaxrsProvidersToRegisterBuildItem setupProviders(BuildProducer providersToRegister = new HashSet<>(otherProviders); + if (!capabilities.isCapabilityPresent(Capabilities.RESTEASY_JSON_EXTENSION)) { + + boolean needJsonSupport = restJsonSupportNeeded(indexBuildItem, ResteasyDotNames.CONSUMES) + || restJsonSupportNeeded(indexBuildItem, ResteasyDotNames.PRODUCES); + if (needJsonSupport) { + LOGGER.warn( + "Quarkus detected the need of REST JSON support but you have not provided the necessary JSON " + + "extension for this. You can visit https://quarkus.io/guides/rest-json-guide for more " + + "information on how to set one."); + } + } + // we add a couple of default providers providersToRegister.add(StringTextStar.class.getName()); providersToRegister.addAll(categorizedWriters.getPossible(MediaType.APPLICATION_JSON_TYPE)); @@ -134,6 +159,21 @@ JaxrsProvidersToRegisterBuildItem setupProviders(BuildProducer mediaTypes = Arrays.asList(annotationValue.asStringArray()); + return mediaTypes.contains(MediaType.APPLICATION_JSON) + || mediaTypes.contains(MediaType.APPLICATION_JSON_PATCH_JSON); + } + + return false; + } + public static void categorizeProviders(Set availableProviders, MediaTypeMap categorizedReaders, MediaTypeMap categorizedWriters, MediaTypeMap categorizedContextResolvers, Set otherProviders) { diff --git a/extensions/resteasy-jackson/deployment/src/main/java/io/quarkus/resteasy/jackson/deployment/ResteasyJacksonProcessor.java b/extensions/resteasy-jackson/deployment/src/main/java/io/quarkus/resteasy/jackson/deployment/ResteasyJacksonProcessor.java index 099f10bf122e7..e7c0d23065707 100644 --- a/extensions/resteasy-jackson/deployment/src/main/java/io/quarkus/resteasy/jackson/deployment/ResteasyJacksonProcessor.java +++ b/extensions/resteasy-jackson/deployment/src/main/java/io/quarkus/resteasy/jackson/deployment/ResteasyJacksonProcessor.java @@ -25,6 +25,7 @@ import io.quarkus.arc.InstanceHandle; import io.quarkus.arc.deployment.AdditionalBeanBuildItem; import io.quarkus.arc.deployment.UnremovableBeanBuildItem; +import io.quarkus.deployment.Capabilities; import io.quarkus.deployment.annotations.BuildProducer; import io.quarkus.deployment.annotations.BuildStep; import io.quarkus.deployment.builditem.CombinedIndexBuildItem; @@ -49,7 +50,7 @@ public class ResteasyJacksonProcessor { private static final String QUARKUS_CONTEXT_RESOLVER_NAME = "io.quarkus.resteasy.jackson.runtime.QuarkusObjectMapperContextResolver"; - @BuildStep + @BuildStep(providesCapabilities = Capabilities.RESTEASY_JSON_EXTENSION) void build(BuildProducer feature) { feature.produce(new FeatureBuildItem(FeatureBuildItem.RESTEASY_JACKSON)); } diff --git a/extensions/resteasy-jsonb/deployment/src/main/java/io/quarkus/resteasy/jsonb/deployment/ResteasyJsonbProcessor.java b/extensions/resteasy-jsonb/deployment/src/main/java/io/quarkus/resteasy/jsonb/deployment/ResteasyJsonbProcessor.java index 91ed7570c93fd..724cc4c022501 100755 --- a/extensions/resteasy-jsonb/deployment/src/main/java/io/quarkus/resteasy/jsonb/deployment/ResteasyJsonbProcessor.java +++ b/extensions/resteasy-jsonb/deployment/src/main/java/io/quarkus/resteasy/jsonb/deployment/ResteasyJsonbProcessor.java @@ -1,12 +1,13 @@ package io.quarkus.resteasy.jsonb.deployment; +import io.quarkus.deployment.Capabilities; import io.quarkus.deployment.annotations.BuildProducer; import io.quarkus.deployment.annotations.BuildStep; import io.quarkus.deployment.builditem.FeatureBuildItem; public class ResteasyJsonbProcessor { - @BuildStep + @BuildStep(providesCapabilities = Capabilities.RESTEASY_JSON_EXTENSION) void build(BuildProducer feature) { feature.produce(new FeatureBuildItem(FeatureBuildItem.RESTEASY_JSONB)); } diff --git a/extensions/resteasy/deployment/pom.xml b/extensions/resteasy/deployment/pom.xml index 21ec083bba38d..30059700c5bda 100644 --- a/extensions/resteasy/deployment/pom.xml +++ b/extensions/resteasy/deployment/pom.xml @@ -48,7 +48,7 @@ rest-assured test - + org.jboss.resteasy resteasy-json-binding-provider