Skip to content

Commit 49d2ce6

Browse files
committed
fix #4316 - additionalProperties and ArraySchema.implementation processing
1 parent 1eb2774 commit 49d2ce6

File tree

5 files changed

+151
-15
lines changed

5 files changed

+151
-15
lines changed

modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ModelResolver.java

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -750,7 +750,7 @@ public Schema resolve(AnnotatedType annotatedType, ModelConverterContext context
750750
if (reResolvedProperty.isPresent()) {
751751
property = reResolvedProperty.get();
752752
}
753-
reResolvedProperty = AnnotationsUtils.getArraySchema(ctxArraySchema, annotatedType.getComponents(), null, openapi31, property);
753+
reResolvedProperty = AnnotationsUtils.getArraySchema(ctxArraySchema, annotatedType.getComponents(), null, openapi31, property, true);
754754
if (reResolvedProperty.isPresent()) {
755755
property = reResolvedProperty.get();
756756
}
@@ -2701,6 +2701,19 @@ protected void resolveSchemaMembers(Schema schema, AnnotatedType annotatedType,
27012701
Annotated a = beanDesc.getClassInfo();
27022702
Annotation[] annotations = annotatedType.getCtxAnnotations();
27032703
resolveSchemaMembers(schema, a, annotations, schemaAnnotation);
2704+
if (schemaAnnotation != null) {
2705+
if (schemaAnnotation.additionalProperties().equals(io.swagger.v3.oas.annotations.media.Schema.AdditionalPropertiesValue.TRUE)) {
2706+
schema.additionalProperties(true);
2707+
} else if (schemaAnnotation.additionalProperties().equals(io.swagger.v3.oas.annotations.media.Schema.AdditionalPropertiesValue.FALSE)) {
2708+
schema.additionalProperties(false);
2709+
} else {
2710+
if (!schemaAnnotation.additionalPropertiesSchema().equals(Void.class)) {
2711+
Schema additionalPropertiesSchema = resolve(new AnnotatedType(schemaAnnotation.additionalPropertiesSchema()), context, next);
2712+
additionalPropertiesSchema = buildRefSchemaIfObject(additionalPropertiesSchema, context);
2713+
schema.additionalProperties(additionalPropertiesSchema);
2714+
}
2715+
}
2716+
}
27042717

27052718
if (openapi31 && schema != null && schemaAnnotation != null) {
27062719
if (!Void.class.equals(schemaAnnotation.contentSchema())) {
@@ -2734,18 +2747,6 @@ protected void resolveSchemaMembers(Schema schema, AnnotatedType annotatedType,
27342747
schema.setUnevaluatedProperties(unevaluatedProperties);
27352748
}
27362749

2737-
if (schemaAnnotation.additionalProperties().equals(io.swagger.v3.oas.annotations.media.Schema.AdditionalPropertiesValue.TRUE)) {
2738-
schema.additionalProperties(true);
2739-
} else if (schemaAnnotation.additionalProperties().equals(io.swagger.v3.oas.annotations.media.Schema.AdditionalPropertiesValue.FALSE)) {
2740-
schema.additionalProperties(false);
2741-
} else {
2742-
if (!schemaAnnotation.additionalPropertiesSchema().equals(Void.class)) {
2743-
Schema additionalPropertiesSchema = resolve(new AnnotatedType(schemaAnnotation.additionalPropertiesSchema()), context, next);
2744-
additionalPropertiesSchema = buildRefSchemaIfObject(additionalPropertiesSchema, context);
2745-
schema.additionalProperties(additionalPropertiesSchema);
2746-
}
2747-
}
2748-
27492750
final Map<String, List<String>> dependentRequired = resolveDependentRequired(a, annotations, schemaAnnotation);
27502751
if (dependentRequired != null && !dependentRequired.isEmpty()) {
27512752
schema.setDependentRequired(dependentRequired);

modules/swagger-core/src/main/java/io/swagger/v3/core/util/AnnotationsUtils.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,8 @@ public static boolean hasSchemaAnnotation(io.swagger.v3.oas.annotations.media.Sc
126126
&& schema.patternProperties().length == 0
127127
&& schema.properties().length == 0
128128
&& StringUtils.isBlank(schema._const())
129-
130-
131129
&& schema.additionalProperties().equals(io.swagger.v3.oas.annotations.media.Schema.AdditionalPropertiesValue.USE_ADDITIONAL_PROPERTIES_ANNOTATION)
130+
&& schema.additionalPropertiesSchema().equals(Void.class)
132131
) {
133132
return false;
134133
}

modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/ReaderTest.java

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@
1515
import io.swagger.v3.jaxrs2.matchers.SerializationMatchers;
1616
import io.swagger.v3.jaxrs2.petstore31.PetResource;
1717
import io.swagger.v3.jaxrs2.petstore31.TagResource;
18+
import io.swagger.v3.jaxrs2.resources.ArraySchemaImplementationResource;
1819
import io.swagger.v3.jaxrs2.resources.DefaultResponseResource;
1920
import io.swagger.v3.jaxrs2.resources.Misc31Resource;
2021
import io.swagger.v3.jaxrs2.resources.ParameterMaximumValueResource;
2122
import io.swagger.v3.jaxrs2.resources.ResponseReturnTypeResource;
23+
import io.swagger.v3.jaxrs2.resources.SchemaAdditionalPropertiesBooleanResource;
2224
import io.swagger.v3.jaxrs2.resources.SchemaAdditionalPropertiesResource;
2325
import io.swagger.v3.jaxrs2.resources.SchemaPropertiesResource;
2426
import io.swagger.v3.jaxrs2.resources.SiblingPropResource;
@@ -3081,6 +3083,81 @@ public void testSchemaAdditionalProperties() {
30813083
SerializationMatchers.assertEqualsToYaml(openAPI, yaml);
30823084
}
30833085

3086+
@Test(description = "Test Schema AdditionalProperties annotations")
3087+
public void testSchemaAdditionalPropertiesBoolean() {
3088+
ModelConverters.reset();
3089+
SwaggerConfiguration config = new SwaggerConfiguration().openAPI(new OpenAPI()).schemaResolution(Schema.SchemaResolution.ALL_OF);
3090+
Reader reader = new Reader(config);
3091+
3092+
OpenAPI openAPI = reader.read(SchemaAdditionalPropertiesBooleanResource.class);
3093+
String yaml = "openapi: 3.0.1\n" +
3094+
"paths:\n" +
3095+
" /test:\n" +
3096+
" get:\n" +
3097+
" operationId: test\n" +
3098+
" responses:\n" +
3099+
" default:\n" +
3100+
" description: default response\n" +
3101+
" content:\n" +
3102+
" '*/*':\n" +
3103+
" schema:\n" +
3104+
" $ref: '#/components/schemas/Pet'\n" +
3105+
"components:\n" +
3106+
" schemas:\n" +
3107+
" Bar:\n" +
3108+
" type: object\n" +
3109+
" properties:\n" +
3110+
" foo:\n" +
3111+
" type: string\n" +
3112+
" Pet:\n" +
3113+
" type: object\n" +
3114+
" properties:\n" +
3115+
" bar:\n" +
3116+
" allOf:\n" +
3117+
" - additionalProperties:\n" +
3118+
" $ref: '#/components/schemas/Bar'\n" +
3119+
" - $ref: '#/components/schemas/Bar'\n" +
3120+
" vbar:\n" +
3121+
" allOf:\n" +
3122+
" - additionalProperties: false\n" +
3123+
" - $ref: '#/components/schemas/Bar'\n" +
3124+
" additionalProperties: false\n";
3125+
SerializationMatchers.assertEqualsToYaml(openAPI, yaml);
3126+
ModelConverters.reset();
3127+
}
3128+
3129+
@Test(description = "Test ArraySchema implementation annotations")
3130+
public void testArraySchemaImplementation() {
3131+
SwaggerConfiguration config = new SwaggerConfiguration().openAPI31(true).openAPI(new OpenAPI());
3132+
Reader reader = new Reader(config);
3133+
3134+
OpenAPI openAPI = reader.read(ArraySchemaImplementationResource.class);
3135+
String yaml = "openapi: 3.1.0\n" +
3136+
"paths:\n" +
3137+
" /test:\n" +
3138+
" get:\n" +
3139+
" operationId: test\n" +
3140+
" responses:\n" +
3141+
" default:\n" +
3142+
" description: default response\n" +
3143+
" content:\n" +
3144+
" '*/*':\n" +
3145+
" schema:\n" +
3146+
" $ref: '#/components/schemas/Pet'\n" +
3147+
"components:\n" +
3148+
" schemas:\n" +
3149+
" Pet:\n" +
3150+
" type: object\n" +
3151+
" properties:\n" +
3152+
" cars:\n" +
3153+
" type: array\n" +
3154+
" items:\n" +
3155+
" type: integer\n" +
3156+
" format: int32\n" +
3157+
" description: A house in a street\n";
3158+
SerializationMatchers.assertEqualsToYaml31(openAPI, yaml);
3159+
}
3160+
30843161
@Test(description = "Responses schema resolved from return type")
30853162
public void testResponseReturnType() {
30863163
Reader reader = new Reader(new OpenAPI());
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package io.swagger.v3.jaxrs2.resources;
2+
3+
import io.swagger.v3.oas.annotations.media.ArraySchema;
4+
import io.swagger.v3.oas.annotations.media.Schema;
5+
6+
import javax.ws.rs.GET;
7+
import javax.ws.rs.Path;
8+
import java.util.List;
9+
10+
public class ArraySchemaImplementationResource {
11+
12+
static class Pet {
13+
@ArraySchema(schema = @Schema(implementation = Integer.class, description = "A house in a street"))
14+
public List<Number> cars;
15+
}
16+
17+
@GET
18+
@Path("/test")
19+
public Pet test() {
20+
return null;
21+
}
22+
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package io.swagger.v3.jaxrs2.resources;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
5+
import javax.ws.rs.GET;
6+
import javax.ws.rs.Path;
7+
8+
9+
public class SchemaAdditionalPropertiesBooleanResource {
10+
11+
@Schema(additionalProperties = Schema.AdditionalPropertiesValue.FALSE)
12+
static class Pet {
13+
@Schema(additionalPropertiesSchema = Bar.class)
14+
public Bar bar;
15+
16+
@Schema(additionalProperties = Schema.AdditionalPropertiesValue.FALSE)
17+
public Bar vbar;
18+
}
19+
20+
21+
static class Bar {
22+
public String foo;
23+
}
24+
25+
@Schema(description = "A car")
26+
static class Car {
27+
public String foo;
28+
}
29+
30+
@GET
31+
@Path("/test")
32+
public Pet test() {
33+
return null;
34+
}
35+
36+
}

0 commit comments

Comments
 (0)