diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ModelResolver.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ModelResolver.java index 177968b8d6..1ca65758a0 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ModelResolver.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ModelResolver.java @@ -865,6 +865,7 @@ public Schema resolve(AnnotatedType annotatedType, ModelConverterContext context } resolveDiscriminatorProperty(type, context, model); + model = resolveWrapping(type, context, model); return model; } @@ -1770,6 +1771,32 @@ protected void resolveDiscriminatorProperty(JavaType type, ModelConverterContext } } + /* + TODO partial implementation supporting WRAPPER_OBJECT with JsonTypeInfo.Id.CLASS and JsonTypeInfo.Id.NAME + + Also note that JsonTypeInfo on interfaces are not considered as multiple interfaces might have conflicting + annotations, although Jackson seems to apply them if present on an interface + */ + protected Schema resolveWrapping(JavaType type, ModelConverterContext context, Schema model) { + // add JsonTypeInfo.property if not member of bean + JsonTypeInfo typeInfo = type.getRawClass().getDeclaredAnnotation(JsonTypeInfo.class); + if (typeInfo != null) { + JsonTypeInfo.Id id = typeInfo.use(); + JsonTypeInfo.As as = typeInfo.include(); + if (JsonTypeInfo.As.WRAPPER_OBJECT.equals(as)) { + String name = model.getName(); + if (JsonTypeInfo.Id.CLASS.equals(id)) { + name = type.getRawClass().getName(); + } + Schema wrapperSchema = new ObjectSchema(); + wrapperSchema.name(model.getName()); + wrapperSchema.addProperties(name, model); + return wrapperSchema; + } + } + return model; + } + protected Discriminator resolveDiscriminator(JavaType type, ModelConverterContext context) { io.swagger.v3.oas.annotations.media.Schema declaredSchemaAnnotation = AnnotationsUtils.getSchemaDeclaredAnnotation(type.getRawClass()); diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ModelConverterTest.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ModelConverterTest.java index f77c81858d..dd03bf992c 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ModelConverterTest.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/converting/ModelConverterTest.java @@ -130,7 +130,7 @@ public void maintainPropertyNames() { public void serializeParameterizedType() { final Map schemas = readAll(Employee.class); - final Schema employee = (Schema) schemas.get("employee"); + final Schema employee = (Schema) schemas.get("employee").getProperties().get("employee"); final Map props = employee.getProperties(); final Iterator et = props.keySet().iterator(); diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket2862SubtypeTest.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket2862SubtypeTest.java index d5a92a1068..55065f7289 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket2862SubtypeTest.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket2862SubtypeTest.java @@ -20,13 +20,16 @@ public void testSubType() throws Exception { SerializationMatchers.assertEqualsToYaml(context.getDefinedModels(), "Ticket2862Model:\n" + " type: object\n" + + " properties:\n" + + " Ticket2862Model:\n" + + " type: object\n" + "Ticket2862ModelImpl:\n" + " type: string\n" + " allOf:\n" + " - $ref: '#/components/schemas/Ticket2862Model'\n" + " enum:\n" + " - VALUE1\n" + - " - VALUE2"); + " - VALUE2\n"); } } diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket2884Test.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket2884Test.java new file mode 100644 index 0000000000..53c7ae0eb6 --- /dev/null +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket2884Test.java @@ -0,0 +1,48 @@ +package io.swagger.v3.core.resolving; + +import io.swagger.v3.core.converter.AnnotatedType; +import io.swagger.v3.core.converter.ModelConverterContextImpl; +import io.swagger.v3.core.jackson.ModelResolver; +import io.swagger.v3.core.matchers.SerializationMatchers; +import io.swagger.v3.core.resolving.resources.Ticket2884Model; +import io.swagger.v3.core.resolving.resources.Ticket2884ModelClass; +import io.swagger.v3.oas.models.media.Schema; +import org.testng.annotations.Test; + +public class Ticket2884Test extends SwaggerTestBase { + @Test + public void test2884() throws Exception { + final ModelResolver modelResolver = new ModelResolver(mapper()); + + ModelConverterContextImpl context = new ModelConverterContextImpl(modelResolver); + + Ticket2884ModelClass a = new Ticket2884ModelClass(); + + Schema model = context + .resolve(new AnnotatedType(Ticket2884Model.class)); + + SerializationMatchers.assertEqualsToYaml(context.getDefinedModels(), "Ticket2884Model:\n" + + " type: object\n" + + " properties:\n" + + " Ticket2884Model:\n" + + " type: object"); + + context = new ModelConverterContextImpl(modelResolver); + model = context + .resolve(new AnnotatedType(Ticket2884ModelClass.class)); + + SerializationMatchers.assertEqualsToYaml(context.getDefinedModels(), "Ticket2884ModelClass:\n" + + " type: object\n" + + " properties:\n" + + " Ticket2884ModelClass:\n" + + " type: object\n" + + " properties:\n" + + " bar:\n" + + " type: string\n" + + " foo:\n" + + " type: array\n" + + " items:\n" + + " type: string\n"); + } + +} diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket2915Test.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket2915Test.java index 961d1b77ec..cc2ebfbb5c 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket2915Test.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket2915Test.java @@ -5,7 +5,6 @@ import io.swagger.v3.core.jackson.ModelResolver; import io.swagger.v3.core.matchers.SerializationMatchers; import io.swagger.v3.core.resolving.resources.TestObject2915; -import io.swagger.v3.core.resolving.resources.Ticket2862Model; import io.swagger.v3.oas.models.media.Schema; import org.testng.annotations.Test; diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/resources/Ticket2884Model.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/resources/Ticket2884Model.java new file mode 100644 index 0000000000..b7ef33388d --- /dev/null +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/resources/Ticket2884Model.java @@ -0,0 +1,6 @@ +package io.swagger.v3.core.resolving.resources; + +@com.fasterxml.jackson.annotation.JsonTypeInfo( + use = com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME, + include = com.fasterxml.jackson.annotation.JsonTypeInfo.As.WRAPPER_OBJECT) +public interface Ticket2884Model {} diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/resources/Ticket2884ModelClass.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/resources/Ticket2884ModelClass.java new file mode 100644 index 0000000000..f7d38ed010 --- /dev/null +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/resources/Ticket2884ModelClass.java @@ -0,0 +1,13 @@ +package io.swagger.v3.core.resolving.resources; + +import java.util.List; + +@com.fasterxml.jackson.annotation.JsonTypeInfo( + use = com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME, + include = com.fasterxml.jackson.annotation.JsonTypeInfo.As.WRAPPER_OBJECT) +public class Ticket2884ModelClass { + + public String bar; + public List foo; + +} diff --git a/modules/swagger-gradle-plugin/build.gradle b/modules/swagger-gradle-plugin/build.gradle index 643dff511c..0ad7b9051e 100644 --- a/modules/swagger-gradle-plugin/build.gradle +++ b/modules/swagger-gradle-plugin/build.gradle @@ -25,7 +25,15 @@ dependencies { implementation 'org.apache.commons:commons-lang3:3.7' testImplementation gradleTestKit() - testImplementation 'com.github.tomakehurst:wiremock:2.27.2' + testImplementation('com.github.tomakehurst:wiremock:2.27.2') { + exclude group: 'com.jayway.jsonpath', module: 'json-path' + exclude group: 'org.eclipse.jetty', module: 'jetty-server' + exclude group: 'org.eclipse.jetty', module: 'jetty-servlet' + exclude group: 'org.eclipse.jetty', module: 'jetty-servlets' + exclude group: 'org.eclipse.jetty', module: 'jetty-webapp' + exclude group: 'org.eclipse.jetty', module: 'jetty-proxy' + exclude group: 'commons-codec', module: 'commons-codec' + } testImplementation 'javax.servlet:javax.servlet-api:3.1.0' testImplementation 'com.google.guava:guava:30.1-jre' testImplementation 'javax.ws.rs:javax.ws.rs-api:2.1' @@ -39,15 +47,6 @@ dependencies { testImplementation "org.apache.httpcomponents:httpclient:4.5.13" testImplementation "commons-codec:commons-codec:1.15" testImplementation "org.apache.commons:commons-compress:1.20" - - testImplementation('com.github.tomakehurst:wiremock:2.27.2') { - exclude group: 'org.eclipse.jetty', module: 'jetty-server' - exclude group: 'org.eclipse.jetty', module: 'jetty-servlet' - exclude group: 'org.eclipse.jetty', module: 'jetty-servlets' - exclude group: 'org.eclipse.jetty', module: 'jetty-webapp' - exclude group: 'org.eclipse.jetty', module: 'jetty-proxy' - exclude group: 'commons-codec', module: 'commons-codec' - } } // * * * * * * * * * * * * diff --git a/modules/swagger-gradle-plugin/gradle.properties b/modules/swagger-gradle-plugin/gradle.properties index 9253eb5044..2e728bd140 100644 --- a/modules/swagger-gradle-plugin/gradle.properties +++ b/modules/swagger-gradle-plugin/gradle.properties @@ -1,2 +1,2 @@ version=2.1.8-SNAPSHOT -jettyVersion=9.4.35.v20201120 +jettyVersion=9.4.39.v20210325 diff --git a/modules/swagger-jaxrs2/pom.xml b/modules/swagger-jaxrs2/pom.xml index 499618614c..79bd55ce02 100644 --- a/modules/swagger-jaxrs2/pom.xml +++ b/modules/swagger-jaxrs2/pom.xml @@ -57,24 +57,6 @@ - - org.apache.maven.plugins - maven-failsafe-plugin - ${failsafe-plugin-version} - - - - integration-test - verify - - - - ${jetty.port} - - - - - org.eclipse.jetty jetty-maven-plugin @@ -83,6 +65,9 @@ ${jetty.port} a ${jetty.port.stop} + + jar + true ${project.basedir}/src/test/webapp @@ -106,6 +91,24 @@ + + org.apache.maven.plugins + maven-failsafe-plugin + ${failsafe-plugin-version} + + + + integration-test + verify + + + + ${jetty.port} + + + + + io.swagger.core.v3 swagger-eclipse-transformer-maven-plugin diff --git a/modules/swagger-maven-plugin/pom.xml b/modules/swagger-maven-plugin/pom.xml index e219cbb6d9..4179d54b7e 100644 --- a/modules/swagger-maven-plugin/pom.xml +++ b/modules/swagger-maven-plugin/pom.xml @@ -273,7 +273,7 @@ UTF-8 3.6.3 4.13.1 - 9.4.35.v20201120 + 9.4.39.v20210325 1.20 diff --git a/modules/swagger-project-jakarta/pom.xml b/modules/swagger-project-jakarta/pom.xml index c4f3a41498..0c54471cfb 100644 --- a/modules/swagger-project-jakarta/pom.xml +++ b/modules/swagger-project-jakarta/pom.xml @@ -571,7 +571,7 @@ 3.7 2.6 1.7.25 - 9.4.9.v20180320 + 9.4.39.v20210325 7.3.0 2.28.2 4.3.2 diff --git a/pom.xml b/pom.xml index 7de803733f..e7d811ec13 100644 --- a/pom.xml +++ b/pom.xml @@ -632,7 +632,7 @@ 3.7 2.6 1.7.25 - 9.4.9.v20180320 + 9.4.39.v20210325 7.3.0 2.28.2 4.3.2