Skip to content

Commit 1859ee6

Browse files
authored
Merge pull request #4729 from swagger-api/Fix-#4715-JsonSchemaDialect
refs #4715 - change JsonSchemaDialect to one accepted by Swagger-UI
2 parents ed6be13 + 16d403e commit 1859ee6

File tree

11 files changed

+157
-10
lines changed

11 files changed

+157
-10
lines changed

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

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -536,18 +536,24 @@ public Schema resolve(AnnotatedType annotatedType, ModelConverterContext context
536536
}
537537
}
538538
} else if (isComposedSchema) {
539-
model = new ComposedSchema()
540-
.type("object")
541-
.name(name);
539+
model = new ComposedSchema().name(name);
540+
if (openapi31 && resolvedArrayAnnotation == null){
541+
model.addType("object");
542+
}else{
543+
model.type("object");
544+
}
542545
} else {
543546
AnnotatedType aType = ReferenceTypeUtils.unwrapReference(annotatedType);
544547
if (aType != null) {
545548
model = context.resolve(aType);
546549
return model;
547550
} else {
548-
model = new Schema()
549-
.type("object")
550-
.name(name);
551+
model = new Schema().name(name);
552+
if (openapi31 && resolvedArrayAnnotation == null){
553+
model.addType("object");
554+
}else{
555+
model.type("object");
556+
}
551557
}
552558
}
553559

@@ -2980,7 +2986,7 @@ public void setOpenapi31(boolean openapi31) {
29802986
}
29812987

29822988
protected boolean isObjectSchema(Schema schema) {
2983-
return "object".equals(schema.getType()) || (schema.getType() == null && schema.getProperties() != null && !schema.getProperties().isEmpty());
2989+
return (schema.getTypes() != null && schema.getTypes().contains("object")) || "object".equals(schema.getType()) || (schema.getType() == null && schema.getProperties() != null && !schema.getProperties().isEmpty());
29842990
}
29852991

29862992
protected Schema buildRefSchemaIfObject(Schema schema, ModelConverterContext context) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public class OpenAPI30To31 {
1010

1111
public void process(OpenAPI openAPI) {
1212
openAPI.openapi("3.1.0")
13-
.jsonSchemaDialect("https://json-schema.org/draft/2020-12/schema")
13+
.jsonSchemaDialect("https://spec.openapis.org/oas/3.1/dialect/base")
1414
.specVersion(SpecVersion.V31);
1515

1616
removeReservedExtensionsName(openAPI.getExtensions());

modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket4679Test.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public class Ticket4679Test extends SwaggerTestBase{
1515
public void testCustomSchemaImplementation() {
1616

1717
String expectedYaml = "ModelWithCustomSchemaImplementationInProperty:\n" +
18+
" type: object\n" +
1819
" properties:\n" +
1920
" exampleField:\n" +
2021
" type: integer\n" +
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package io.swagger.v3.core.resolving.resources;
2+
3+
import io.swagger.v3.oas.annotations.media.ArraySchema;
4+
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
8+
public class TestArrayType {
9+
10+
private Integer id;
11+
12+
@ArraySchema(maxItems = 10)
13+
private List<String> names;
14+
15+
public Integer getId() {
16+
return id;
17+
}
18+
19+
public void setId(Integer id) {
20+
this.id = id;
21+
}
22+
23+
public List<String> getNames() {
24+
return names;
25+
}
26+
27+
public void setNames(List<String> names) {
28+
this.names = names;
29+
}
30+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package io.swagger.v3.core.resolving.resources;
2+
3+
public class TestObject4715 {
4+
5+
private String foo;
6+
7+
private String bar;
8+
9+
private Integer id;
10+
11+
public String getFoo() {
12+
return foo;
13+
}
14+
15+
public void setFoo(String foo) {
16+
this.foo = foo;
17+
}
18+
19+
public String getBar() {
20+
return bar;
21+
}
22+
23+
public void setBar(String bar) {
24+
this.bar = bar;
25+
}
26+
27+
public Integer getId() {
28+
return id;
29+
}
30+
31+
public void setId(Integer id) {
32+
this.id = id;
33+
}
34+
}

modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/v31/ModelResolverOAS31Test.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import io.swagger.v3.core.jackson.ModelResolver;
66
import io.swagger.v3.core.matchers.SerializationMatchers;
77
import io.swagger.v3.core.resolving.SwaggerTestBase;
8+
import io.swagger.v3.core.resolving.resources.TestArrayType;
9+
import io.swagger.v3.core.resolving.resources.TestObject4715;
810
import io.swagger.v3.core.resolving.v31.model.AnnotatedArray;
911
import io.swagger.v3.core.resolving.v31.model.ModelWithDependentSchema;
1012
import io.swagger.v3.core.resolving.v31.model.ModelWithOAS31Stuff;
@@ -39,6 +41,7 @@ public void testOAS31Fields() {
3941
final ModelConverterContextImpl context = new ModelConverterContextImpl(modelResolver);
4042
Schema model = context.resolve(new AnnotatedType(ModelWithOAS31Stuff.class));
4143
SerializationMatchers.assertEqualsToYaml31(context.getDefinedModels(), "Address:\n" +
44+
" type: object\n" +
4245
" if:\n" +
4346
" $ref: '#/components/schemas/AnnotatedCountry'\n" +
4447
" then:\n" +
@@ -59,17 +62,20 @@ public void testOAS31Fields() {
5962
" propertyNames:\n" +
6063
" $ref: '#/components/schemas/PropertyNamesPattern'\n" +
6164
"AnnotatedCountry:\n" +
65+
" type: object\n" +
6266
" properties:\n" +
6367
" country:\n" +
6468
" const: United States\n" +
6569
"Client:\n" +
70+
" type: object\n" +
6671
" properties:\n" +
6772
" name:\n" +
6873
" type: string\n" +
6974
" creditCard:\n" +
7075
" type: integer\n" +
7176
" format: int32\n" +
7277
"CreditCard:\n" +
78+
" type: object\n" +
7379
" properties:\n" +
7480
" billingAddress:\n" +
7581
" type: string\n" +
@@ -124,6 +130,7 @@ public void testOAS31Fields() {
124130
" properties:\n" +
125131
" extraObject: {}\n" +
126132
"MultipleBaseBean:\n" +
133+
" type: object\n" +
127134
" description: MultipleBaseBean\n" +
128135
" properties:\n" +
129136
" beanType:\n" +
@@ -152,14 +159,17 @@ public void testOAS31Fields() {
152159
" format: int32\n" +
153160
" description: MultipleSub2Bean\n" +
154161
"PostalCodeNumberPattern:\n" +
162+
" type: object\n" +
155163
" properties:\n" +
156164
" postalCode:\n" +
157165
" pattern: \"[0-9]{5}(-[0-9]{4})?\"\n" +
158166
"PostalCodePattern:\n" +
167+
" type: object\n" +
159168
" properties:\n" +
160169
" postalCode:\n" +
161170
" pattern: \"[A-Z][0-9][A-Z] [0-9][A-Z][0-9]\"\n" +
162171
"PropertyNamesPattern:\n" +
172+
" type: object\n" +
163173
" pattern: \"^[A-Za-z_][A-Za-z0-9_]*$\"\n");
164174
}
165175

@@ -170,10 +180,12 @@ public void testDependentSchemasAnnotation() {
170180
io.swagger.v3.oas.models.media.Schema model = context.resolve(new AnnotatedType(ModelWithDependentSchema.class));
171181

172182
SerializationMatchers.assertEqualsToYaml31(context.getDefinedModels(), "BooleanFakeClass:\n" +
183+
" type: object\n" +
173184
" properties:\n" +
174185
" type:\n" +
175186
" type: boolean\n" +
176187
"ModelWithDependentSchema:\n" +
188+
" type: object\n" +
177189
" dependentSchemas:\n" +
178190
" value:\n" +
179191
" properties:\n" +
@@ -187,4 +199,36 @@ public void testDependentSchemasAnnotation() {
187199
" format: int32\n");
188200
}
189201

202+
@Test(description = "Top level type:object should appear in OAS31")
203+
public void testObjectTypeSchemaOAS31(){
204+
final ModelResolver modelResolver = new ModelResolver(mapper()).openapi31(true);
205+
final ModelConverterContextImpl context = new ModelConverterContextImpl(modelResolver);
206+
io.swagger.v3.oas.models.media.Schema model = context.resolve(new AnnotatedType(TestObject4715.class));
207+
SerializationMatchers.assertEqualsToYaml31(model, "type: object\n" +
208+
"properties:\n" +
209+
" foo:\n" +
210+
" type: string\n" +
211+
" bar:\n" +
212+
" type: string\n" +
213+
" id:\n" +
214+
" type: integer\n" +
215+
" format: int32");
216+
}
217+
218+
@Test
219+
public void testFieldArraySchemaAnnotation() {
220+
final ModelResolver modelResolver = new ModelResolver(mapper()).openapi31(true);
221+
final ModelConverterContextImpl context = new ModelConverterContextImpl(modelResolver);
222+
io.swagger.v3.oas.models.media.Schema model = context.resolve(new AnnotatedType(TestArrayType.class));
223+
SerializationMatchers.assertEqualsToYaml31(model, " type: object\n" +
224+
" properties:\n" +
225+
" id:\n" +
226+
" type: integer\n" +
227+
" format: int32\n" +
228+
" names:\n" +
229+
" type: array\n" +
230+
" items:\n" +
231+
" type: string\n" +
232+
" maxItems: 10");
233+
}
190234
}

0 commit comments

Comments
 (0)