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 a6c66f7f53..03d25f73a8 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 @@ -124,6 +124,7 @@ public Schema resolve(AnnotatedType annotatedType, ModelConverterContext context boolean isPrimitive = false; Schema model = null; + List requiredProps = new ArrayList<>(); if (annotatedType == null) { return null; @@ -644,7 +645,7 @@ public Schema resolve(AnnotatedType annotatedType, ModelConverterContext context .ctxAnnotations(null) .jsonUnwrappedHandler(null) .resolveAsRef(false); - handleUnwrapped(props, context.resolve(t), uw.prefix(), uw.suffix()); + handleUnwrapped(props, context.resolve(t), uw.prefix(), uw.suffix(), requiredProps); return null; } else { return new Schema(); @@ -709,6 +710,9 @@ public Schema resolve(AnnotatedType annotatedType, ModelConverterContext context } if (modelProps.size() > 0) { model.setProperties(modelProps); + for(String propName : requiredProps) { + addRequiredItem(model, propName); + } } /** @@ -1021,10 +1025,14 @@ protected boolean ignore(final Annotated member, final XmlAccessorType xmlAccess return false; } - private void handleUnwrapped(List props, Schema innerModel, String prefix, String suffix) { + private void handleUnwrapped(List props, Schema innerModel, String prefix, String suffix, List requiredProps) { if (StringUtils.isBlank(suffix) && StringUtils.isBlank(prefix)) { if (innerModel.getProperties() != null) { props.addAll(innerModel.getProperties().values()); + if(innerModel.getRequired() != null) { + requiredProps.addAll(innerModel.getRequired()); + } + } } else { if (prefix == null) { diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/JacksonJsonUnwrappedTest.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/JacksonJsonUnwrappedTest.java new file mode 100644 index 0000000000..77514c318d --- /dev/null +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/JacksonJsonUnwrappedTest.java @@ -0,0 +1,36 @@ +package io.swagger.v3.core.resolving; + +import io.swagger.v3.core.converter.ModelConverters; +import io.swagger.v3.core.matchers.SerializationMatchers; +import io.swagger.v3.core.resolving.resources.JacksonUnwrappedRequiredProperty; +import org.testng.annotations.Test; + +public class JacksonJsonUnwrappedTest { + + @Test(description = "test the @JsonUnwrapped behaviour when required Properties") + public void jacksonJsonUnwrappedTest() { + + SerializationMatchers + .assertEqualsToYaml(ModelConverters.getInstance().read( + JacksonUnwrappedRequiredProperty.class), "InnerTypeRequired:\n" + + " required:\n" + + " - name\n" + + " type: object\n" + + " properties:\n" + + " foo:\n" + + " type: integer\n" + + " format: int32\n" + + " name:\n" + + " type: string\n" + + "JacksonUnwrappedRequiredProperty:\n" + + " required:\n" + + " - name\n" + + " type: object\n" + + " properties:\n" + + " foo:\n" + + " type: integer\n" + + " format: int32\n" + + " name:\n" + + " type: string\n"); + } +} diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/resources/InnerTypeRequired.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/resources/InnerTypeRequired.java new file mode 100644 index 0000000000..29d45899fc --- /dev/null +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/resources/InnerTypeRequired.java @@ -0,0 +1,17 @@ +package io.swagger.v3.core.resolving.resources; + +import io.swagger.v3.oas.annotations.media.Schema; + +public class InnerTypeRequired { + public int foo; + @Schema(required = true) + public String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/resources/JacksonUnwrappedRequiredProperty.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/resources/JacksonUnwrappedRequiredProperty.java new file mode 100644 index 0000000000..418acb30be --- /dev/null +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/resources/JacksonUnwrappedRequiredProperty.java @@ -0,0 +1,15 @@ +package io.swagger.v3.core.resolving.resources; + +import com.fasterxml.jackson.annotation.JsonUnwrapped; + +public class JacksonUnwrappedRequiredProperty { + @JsonUnwrapped private final InnerTypeRequired innerType; + + public JacksonUnwrappedRequiredProperty(InnerTypeRequired innerType) { + this.innerType = innerType; + } + + public InnerTypeRequired getInnerType() { + return innerType; + } +}