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 df134f711a..8812bb791d 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 @@ -1108,7 +1108,8 @@ private boolean resolveSubtypes(Schema model, BeanDescription bean, ModelConvert final Schema subtypeModel = context.resolve(new AnnotatedType().type(subtypeType)); - if (subtypeModel.getName().equals(model.getName())) { + if ( StringUtils.isBlank(subtypeModel.getName()) || + subtypeModel.getName().equals(model.getName())) { subtypeModel.setName(_typeNameResolver.nameForType(_mapper.constructType(subtypeType), TypeNameResolver.Options.SKIP_API_MODEL)); } @@ -1153,6 +1154,7 @@ private boolean resolveSubtypes(Schema model, BeanDescription bean, ModelConvert .xml(subtypeModel.getXml()) .extensions(subtypeModel.getExtensions()); + composedSchema.setEnum(subtypeModel.getEnum()); } else { composedSchema = (ComposedSchema) subtypeModel; } 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 new file mode 100644 index 0000000000..d5a92a1068 --- /dev/null +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket2862SubtypeTest.java @@ -0,0 +1,32 @@ +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.Ticket2862Model; +import io.swagger.v3.oas.models.media.Schema; +import org.testng.annotations.Test; + +public class Ticket2862SubtypeTest extends SwaggerTestBase { + @Test + public void testSubType() throws Exception { + final ModelResolver modelResolver = new ModelResolver(mapper()); + + final ModelConverterContextImpl context = new ModelConverterContextImpl(modelResolver); + + final Schema model = context + .resolve(new AnnotatedType(Ticket2862Model.class)); + + SerializationMatchers.assertEqualsToYaml(context.getDefinedModels(), "Ticket2862Model:\n" + + " type: object\n" + + "Ticket2862ModelImpl:\n" + + " type: string\n" + + " allOf:\n" + + " - $ref: '#/components/schemas/Ticket2862Model'\n" + + " enum:\n" + + " - VALUE1\n" + + " - VALUE2"); + } + +} diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/resources/Ticket2862Model.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/resources/Ticket2862Model.java new file mode 100644 index 0000000000..8034ddfce7 --- /dev/null +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/resources/Ticket2862Model.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) +@com.fasterxml.jackson.annotation.JsonSubTypes({ + @com.fasterxml.jackson.annotation.JsonSubTypes.Type(value = Ticket2862ModelImpl.class)}) +public interface Ticket2862Model {} diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/resources/Ticket2862ModelImpl.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/resources/Ticket2862ModelImpl.java new file mode 100644 index 0000000000..bd7cf2d310 --- /dev/null +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/resources/Ticket2862ModelImpl.java @@ -0,0 +1,6 @@ +package io.swagger.v3.core.resolving.resources; + +public enum Ticket2862ModelImpl implements Ticket2862Model { + VALUE1, + VALUE2 +}