Skip to content

Commit f7f1f0f

Browse files
refactor: use SpecVersion enum in ObjectMapperFactory in preparation for OAS 3.2
1 parent 4aeaa51 commit f7f1f0f

1 file changed

Lines changed: 95 additions & 71 deletions

File tree

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

Lines changed: 95 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import io.swagger.v3.oas.models.Operation;
4141
import io.swagger.v3.oas.models.PathItem;
4242
import io.swagger.v3.oas.models.Paths;
43+
import io.swagger.v3.oas.models.SpecVersion;
4344
import io.swagger.v3.oas.models.callbacks.Callback;
4445
import io.swagger.v3.oas.models.examples.Example;
4546
import io.swagger.v3.oas.models.headers.Header;
@@ -74,101 +75,121 @@
7475
public class ObjectMapperFactory {
7576

7677
public static ObjectMapper createJson(JsonFactory jsonFactory) {
77-
return create(jsonFactory, false);
78+
return create(jsonFactory, SpecVersion.V30);
7879
}
7980

8081
public static ObjectMapper createJson() {
81-
return create(null, false);
82+
return create(null, SpecVersion.V30);
8283
}
8384

8485
public static ObjectMapper createYaml(YAMLFactory yamlFactory) {
85-
return create(yamlFactory, false);
86+
return create(yamlFactory, SpecVersion.V30);
8687
}
8788

8889
public static ObjectMapper createYaml() {
89-
return createYaml(false);
90+
return createYaml(SpecVersion.V30);
9091
}
9192

93+
/**
94+
* @deprecated Use {@link #createYaml(SpecVersion)} instead
95+
*/
96+
@Deprecated
9297
public static ObjectMapper createYaml(boolean openapi31) {
98+
return createYaml(openapi31 ? SpecVersion.V31 : SpecVersion.V30);
99+
}
100+
101+
public static ObjectMapper createYaml(SpecVersion specVersion) {
93102
YAMLFactory factory = new YAMLFactory();
94103
factory.disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER);
95104
factory.enable(YAMLGenerator.Feature.MINIMIZE_QUOTES);
96105
factory.enable(YAMLGenerator.Feature.SPLIT_LINES);
97106
factory.enable(YAMLGenerator.Feature.ALWAYS_QUOTE_NUMBERS_AS_STRINGS);
98107

99-
return create(factory, openapi31);
108+
return create(factory, specVersion);
100109
}
101110

102111
public static ObjectMapper createJson31(JsonFactory jsonFactory) {
103-
return create(jsonFactory, true);
112+
return create(jsonFactory, SpecVersion.V31);
104113
}
105114

106115
public static ObjectMapper createJson31() {
107-
return create(null, true);
116+
return create(null, SpecVersion.V31);
108117
}
109118

110119
public static ObjectMapper createYaml31(YAMLFactory yamlFactory) {
111-
return create(yamlFactory, true);
120+
return create(yamlFactory, SpecVersion.V31);
112121
}
113122

114123
public static ObjectMapper createYaml31() {
115-
return createYaml(true);
124+
return createYaml(SpecVersion.V31);
116125
}
117126

127+
/**
128+
* @deprecated Use {@link #create(JsonFactory, SpecVersion)} instead
129+
*/
130+
@Deprecated
118131
public static ObjectMapper create(JsonFactory jsonFactory, boolean openapi31) {
132+
return create(jsonFactory, openapi31 ? SpecVersion.V31 : SpecVersion.V30);
133+
}
134+
135+
public static ObjectMapper create(JsonFactory jsonFactory, SpecVersion specVersion) {
119136
ObjectMapper mapper = jsonFactory == null ? new ObjectMapper() : new ObjectMapper(jsonFactory);
120137

121-
if (!openapi31) {
122-
// handle ref schema serialization skipping all other props
123-
mapper.registerModule(new SimpleModule() {
124-
@Override
125-
public void setupModule(SetupContext context) {
126-
super.setupModule(context);
127-
context.addBeanSerializerModifier(new BeanSerializerModifier() {
128-
@Override
129-
public JsonSerializer<?> modifySerializer(
130-
SerializationConfig config, BeanDescription desc, JsonSerializer<?> serializer) {
131-
if (Schema.class.isAssignableFrom(desc.getBeanClass())) {
132-
return new SchemaSerializer((JsonSerializer<Object>) serializer);
133-
} else if (MediaType.class.isAssignableFrom(desc.getBeanClass())) {
134-
return new MediaTypeSerializer((JsonSerializer<Object>) serializer);
135-
} else if (Example.class.isAssignableFrom(desc.getBeanClass())) {
136-
return new ExampleSerializer((JsonSerializer<Object>) serializer);
138+
switch (specVersion) {
139+
case V30:
140+
// handle ref schema serialization skipping all other props
141+
mapper.registerModule(new SimpleModule() {
142+
@Override
143+
public void setupModule(SetupContext context) {
144+
super.setupModule(context);
145+
context.addBeanSerializerModifier(new BeanSerializerModifier() {
146+
@Override
147+
public JsonSerializer<?> modifySerializer(
148+
SerializationConfig config, BeanDescription desc, JsonSerializer<?> serializer) {
149+
if (Schema.class.isAssignableFrom(desc.getBeanClass())) {
150+
return new SchemaSerializer((JsonSerializer<Object>) serializer);
151+
} else if (MediaType.class.isAssignableFrom(desc.getBeanClass())) {
152+
return new MediaTypeSerializer((JsonSerializer<Object>) serializer);
153+
} else if (Example.class.isAssignableFrom(desc.getBeanClass())) {
154+
return new ExampleSerializer((JsonSerializer<Object>) serializer);
155+
}
156+
return serializer;
137157
}
138-
return serializer;
139-
}
140-
});
141-
}
142-
});
143-
} else {
144-
mapper.registerModule(new SimpleModule() {
145-
@Override
146-
public void setupModule(SetupContext context) {
147-
super.setupModule(context);
148-
context.addBeanSerializerModifier(new BeanSerializerModifier() {
149-
@Override
150-
public JsonSerializer<?> modifySerializer(
151-
SerializationConfig config, BeanDescription desc, JsonSerializer<?> serializer) {
152-
if (Schema.class.isAssignableFrom(desc.getBeanClass())) {
153-
return new Schema31Serializer((JsonSerializer<Object>) serializer);
154-
} else if (MediaType.class.isAssignableFrom(desc.getBeanClass())) {
155-
return new MediaTypeSerializer((JsonSerializer<Object>) serializer);
156-
} else if (Example.class.isAssignableFrom(desc.getBeanClass())) {
157-
return new ExampleSerializer((JsonSerializer<Object>) serializer);
158+
});
159+
}
160+
});
161+
break;
162+
case V31:
163+
mapper.registerModule(new SimpleModule() {
164+
@Override
165+
public void setupModule(SetupContext context) {
166+
super.setupModule(context);
167+
context.addBeanSerializerModifier(new BeanSerializerModifier() {
168+
@Override
169+
public JsonSerializer<?> modifySerializer(
170+
SerializationConfig config, BeanDescription desc, JsonSerializer<?> serializer) {
171+
if (Schema.class.isAssignableFrom(desc.getBeanClass())) {
172+
return new Schema31Serializer((JsonSerializer<Object>) serializer);
173+
} else if (MediaType.class.isAssignableFrom(desc.getBeanClass())) {
174+
return new MediaTypeSerializer((JsonSerializer<Object>) serializer);
175+
} else if (Example.class.isAssignableFrom(desc.getBeanClass())) {
176+
return new ExampleSerializer((JsonSerializer<Object>) serializer);
177+
}
178+
return serializer;
158179
}
159-
return serializer;
160-
}
161-
});
162-
}
163-
});
180+
});
181+
}
182+
});
183+
break;
164184
}
165185

166-
if (!openapi31) {
167-
Module deserializerModule = new DeserializationModule();
168-
mapper.registerModule(deserializerModule);
169-
} else {
170-
Module deserializerModule = new DeserializationModule31();
171-
mapper.registerModule(deserializerModule);
186+
switch (specVersion) {
187+
case V30:
188+
mapper.registerModule(new DeserializationModule());
189+
break;
190+
case V31:
191+
mapper.registerModule(new DeserializationModule31());
192+
break;
172193
}
173194
mapper.registerModule(new JavaTimeModule());
174195

@@ -202,21 +223,24 @@ public JsonSerializer<?> modifySerializer(
202223
sourceMixins.put(Callback.class, ExtensionsMixin.class);
203224

204225

205-
if (!openapi31) {
206-
sourceMixins.put(Schema.class, SchemaMixin.class);
207-
sourceMixins.put(DateSchema.class, DateSchemaMixin.class);
208-
sourceMixins.put(Components.class, ComponentsMixin.class);
209-
sourceMixins.put(Info.class, InfoMixin.class);
210-
sourceMixins.put(License.class, LicenseMixin.class);
211-
sourceMixins.put(OpenAPI.class, OpenAPIMixin.class);
212-
sourceMixins.put(Discriminator.class, DiscriminatorMixin.class);
213-
} else {
214-
sourceMixins.put(Info.class, ExtensionsMixin.class);
215-
sourceMixins.put(Schema.class, Schema31Mixin.class);
216-
sourceMixins.put(Components.class, Components31Mixin.class);
217-
sourceMixins.put(OpenAPI.class, OpenAPI31Mixin.class);
218-
sourceMixins.put(DateSchema.class, DateSchemaMixin.class);
219-
sourceMixins.put(Discriminator.class, Discriminator31Mixin.class);
226+
switch (specVersion) {
227+
case V30:
228+
sourceMixins.put(Schema.class, SchemaMixin.class);
229+
sourceMixins.put(DateSchema.class, DateSchemaMixin.class);
230+
sourceMixins.put(Components.class, ComponentsMixin.class);
231+
sourceMixins.put(Info.class, InfoMixin.class);
232+
sourceMixins.put(License.class, LicenseMixin.class);
233+
sourceMixins.put(OpenAPI.class, OpenAPIMixin.class);
234+
sourceMixins.put(Discriminator.class, DiscriminatorMixin.class);
235+
break;
236+
case V31:
237+
sourceMixins.put(Info.class, ExtensionsMixin.class);
238+
sourceMixins.put(Schema.class, Schema31Mixin.class);
239+
sourceMixins.put(Components.class, Components31Mixin.class);
240+
sourceMixins.put(OpenAPI.class, OpenAPI31Mixin.class);
241+
sourceMixins.put(DateSchema.class, DateSchemaMixin.class);
242+
sourceMixins.put(Discriminator.class, Discriminator31Mixin.class);
243+
break;
220244
}
221245
mapper.setMixIns(sourceMixins);
222246
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

0 commit comments

Comments
 (0)