diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/SwaggerAnnotationIntrospector.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/SwaggerAnnotationIntrospector.java index 7d92263e33..b8803883bd 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/SwaggerAnnotationIntrospector.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/SwaggerAnnotationIntrospector.java @@ -58,6 +58,12 @@ public Boolean hasRequiredMarker(AnnotatedMember m) { return ann.required(); } } + ArraySchema arraySchema = m.getAnnotation(ArraySchema.class); + if (arraySchema != null) { + if (arraySchema.schema().required()) { + return arraySchema.schema().required(); + } + } return null; } diff --git a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/ReaderTest.java b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/ReaderTest.java index 3e9f9fb07a..78663d6345 100644 --- a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/ReaderTest.java +++ b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/ReaderTest.java @@ -42,6 +42,7 @@ import io.swagger.v3.jaxrs2.resources.Ticket2794Resource; import io.swagger.v3.jaxrs2.resources.Ticket2806Resource; import io.swagger.v3.jaxrs2.resources.Ticket2818Resource; +import io.swagger.v3.jaxrs2.resources.Ticket2848Resource; import io.swagger.v3.jaxrs2.resources.UserAnnotationResource; import io.swagger.v3.jaxrs2.resources.extensions.ExtensionsResource; import io.swagger.v3.jaxrs2.resources.extensions.OperationExtensionsResource; @@ -1220,6 +1221,39 @@ public Optional filterOperation(Operation operation, ApiDescription a return super.filterOperation(operation, api, params, cookies, headers); } } + + @Test(description = "array schema required property") + public void testTicket2848() { + Reader reader = new Reader(new OpenAPI()); + + OpenAPI openAPI = reader.read(Ticket2848Resource.class); + String yaml = "openapi: 3.0.1\n" + + "paths:\n" + + " /:\n" + + " get:\n" + + " operationId: getter\n" + + " responses:\n" + + " default:\n" + + " description: default response\n" + + " content:\n" + + " '*/*':\n" + + " schema:\n" + + " $ref: '#/components/schemas/Town'\n" + + "components:\n" + + " schemas:\n" + + " Town:\n" + + " required:\n" + + " - streets\n" + + " type: object\n" + + " properties:\n" + + " streets:\n" + + " minItems: 1\n" + + " uniqueItems: true\n" + + " type: array\n" + + " items:\n" + + " type: string\n"; + SerializationMatchers.assertEqualsToYaml(openAPI, yaml); + } } diff --git a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/resources/Ticket2848Resource.java b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/resources/Ticket2848Resource.java new file mode 100644 index 0000000000..9f0d5d7a1f --- /dev/null +++ b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/resources/Ticket2848Resource.java @@ -0,0 +1,24 @@ +package io.swagger.v3.jaxrs2.resources; + +import io.swagger.v3.oas.annotations.media.ArraySchema; +import io.swagger.v3.oas.annotations.media.Schema; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import java.util.List; + +@Path("/") +public class Ticket2848Resource { + @GET + public Town getter() { + return null; + } + + public static class Town { + @ArraySchema( schema = @Schema(required = true), minItems = 1,uniqueItems = true ) + public List streets; + } + + + +}