Skip to content

Commit 8e6753b

Browse files
committed
Changes report: OpenAPIService is using ObjectMapper without configured modules since SpringDoc 1.6.7 #1655
1 parent 6f19afe commit 8e6753b

File tree

3 files changed

+40
-30
lines changed

3 files changed

+40
-30
lines changed

springdoc-openapi-starter-common/src/main/java/org/springdoc/api/AbstractOpenApiResource.java

Lines changed: 3 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,7 @@
5050
import com.fasterxml.jackson.annotation.JsonView;
5151
import com.fasterxml.jackson.core.JsonProcessingException;
5252
import com.fasterxml.jackson.core.type.TypeReference;
53-
import com.fasterxml.jackson.databind.MapperFeature;
5453
import com.fasterxml.jackson.databind.ObjectMapper;
55-
import com.fasterxml.jackson.databind.SerializationFeature;
5654
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
5755
import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator.Feature;
5856
import io.swagger.v3.core.filter.SpecFilter;
@@ -66,7 +64,6 @@
6664
import io.swagger.v3.oas.models.PathItem;
6765
import io.swagger.v3.oas.models.PathItem.HttpMethod;
6866
import io.swagger.v3.oas.models.Paths;
69-
import io.swagger.v3.oas.models.media.Schema;
7067
import io.swagger.v3.oas.models.media.StringSchema;
7168
import io.swagger.v3.oas.models.parameters.Parameter;
7269
import io.swagger.v3.oas.models.responses.ApiResponses;
@@ -83,17 +80,14 @@
8380
import org.springdoc.core.fn.AbstractRouterFunctionVisitor;
8481
import org.springdoc.core.fn.RouterFunctionData;
8582
import org.springdoc.core.fn.RouterOperation;
86-
import org.springdoc.core.mixins.SortedOpenAPIMixin;
87-
import org.springdoc.core.mixins.SortedOpenAPIMixin31;
88-
import org.springdoc.core.mixins.SortedSchemaMixin;
89-
import org.springdoc.core.mixins.SortedSchemaMixin31;
9083
import org.springdoc.core.models.MethodAttributes;
9184
import org.springdoc.core.properties.SpringDocConfigProperties;
9285
import org.springdoc.core.properties.SpringDocConfigProperties.ApiDocs.OpenApiVersion;
9386
import org.springdoc.core.properties.SpringDocConfigProperties.GroupConfig;
9487
import org.springdoc.core.providers.ActuatorProvider;
9588
import org.springdoc.core.providers.CloudFunctionProvider;
9689
import org.springdoc.core.providers.JavadocProvider;
90+
import org.springdoc.core.providers.ObjectMapperProvider;
9791
import org.springdoc.core.providers.SpringDocProviders;
9892
import org.springdoc.core.service.AbstractRequestService;
9993
import org.springdoc.core.service.GenericParameterService;
@@ -1185,7 +1179,7 @@ protected String writeYamlValue(OpenAPI openAPI) throws JsonProcessingException
11851179
String result;
11861180
ObjectMapper objectMapper = springDocProviders.yamlMapper();
11871181
if (springDocConfigProperties.isWriterWithOrderByKeys())
1188-
sortOutput(objectMapper);
1182+
ObjectMapperProvider.sortOutput(objectMapper, springDocConfigProperties);
11891183
YAMLFactory factory = (YAMLFactory) objectMapper.getFactory();
11901184
factory.configure(Feature.USE_NATIVE_TYPE_ID, false);
11911185
if (!springDocConfigProperties.isWriterWithDefaultPrettyPrinter())
@@ -1256,7 +1250,7 @@ protected String writeJsonValue(OpenAPI openAPI) throws JsonProcessingException
12561250
String result;
12571251
ObjectMapper objectMapper = springDocProviders.jsonMapper();
12581252
if (springDocConfigProperties.isWriterWithOrderByKeys())
1259-
sortOutput(objectMapper);
1253+
ObjectMapperProvider.sortOutput(objectMapper, springDocConfigProperties);
12601254
if (!springDocConfigProperties.isWriterWithDefaultPrettyPrinter())
12611255
result = objectMapper.writerFor(OpenAPI.class).writeValueAsString(openAPI);
12621256
else
@@ -1325,23 +1319,6 @@ enum ConditionType {
13251319
HEADERS
13261320
}
13271321

1328-
/**
1329-
* Sort output.
1330-
*
1331-
* @param objectMapper the object mapper
1332-
*/
1333-
private void sortOutput(ObjectMapper objectMapper) {
1334-
objectMapper.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true);
1335-
objectMapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);
1336-
if (OpenApiVersion.OPENAPI_3_1 == springDocConfigProperties.getApiDocs().getVersion()){
1337-
objectMapper.addMixIn(OpenAPI.class, SortedOpenAPIMixin31.class);
1338-
objectMapper.addMixIn(Schema.class, SortedSchemaMixin31.class);
1339-
} else {
1340-
objectMapper.addMixIn(OpenAPI.class, SortedOpenAPIMixin.class);
1341-
objectMapper.addMixIn(Schema.class, SortedSchemaMixin.class);
1342-
}
1343-
}
1344-
13451322
/**
13461323
* Sets model and view class.
13471324
*

springdoc-openapi-starter-common/src/main/java/org/springdoc/core/providers/ObjectMapperProvider.java

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,20 @@
2424

2525
package org.springdoc.core.providers;
2626

27+
import com.fasterxml.jackson.databind.MapperFeature;
2728
import com.fasterxml.jackson.databind.ObjectMapper;
29+
import com.fasterxml.jackson.databind.SerializationFeature;
2830
import io.swagger.v3.core.util.Json;
2931
import io.swagger.v3.core.util.Json31;
3032
import io.swagger.v3.core.util.ObjectMapperFactory;
3133
import io.swagger.v3.core.util.Yaml;
3234
import io.swagger.v3.core.util.Yaml31;
35+
import io.swagger.v3.oas.models.OpenAPI;
36+
import io.swagger.v3.oas.models.media.Schema;
37+
import org.springdoc.core.mixins.SortedOpenAPIMixin;
38+
import org.springdoc.core.mixins.SortedOpenAPIMixin31;
39+
import org.springdoc.core.mixins.SortedSchemaMixin;
40+
import org.springdoc.core.mixins.SortedSchemaMixin31;
3341
import org.springdoc.core.properties.SpringDocConfigProperties;
3442
import org.springdoc.core.properties.SpringDocConfigProperties.ApiDocs.OpenApiVersion;
3543

@@ -91,10 +99,35 @@ public ObjectMapper yamlMapper() {
9199
*/
92100
public static ObjectMapper createJson(SpringDocConfigProperties springDocConfigProperties) {
93101
OpenApiVersion openApiVersion = springDocConfigProperties.getApiDocs().getVersion();
102+
ObjectMapper objectMapper;
94103
if (openApiVersion == OpenApiVersion.OPENAPI_3_1)
95-
return ObjectMapperProvider.createJson31();
104+
objectMapper = ObjectMapperProvider.createJson31();
96105
else
97-
return ObjectMapperProvider.createJson();
106+
objectMapper = ObjectMapperProvider.createJson();
107+
108+
if (springDocConfigProperties.isWriterWithOrderByKeys())
109+
sortOutput(objectMapper, springDocConfigProperties);
110+
111+
return objectMapper;
112+
}
113+
114+
115+
/**
116+
* Sort output.
117+
*
118+
* @param objectMapper the object mapper
119+
*/
120+
public static void sortOutput(ObjectMapper objectMapper, SpringDocConfigProperties springDocConfigProperties) {
121+
objectMapper.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true);
122+
objectMapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);
123+
if (OpenApiVersion.OPENAPI_3_1 == springDocConfigProperties.getApiDocs().getVersion()) {
124+
objectMapper.addMixIn(OpenAPI.class, SortedOpenAPIMixin31.class);
125+
objectMapper.addMixIn(Schema.class, SortedSchemaMixin31.class);
126+
}
127+
else {
128+
objectMapper.addMixIn(OpenAPI.class, SortedOpenAPIMixin.class);
129+
objectMapper.addMixIn(Schema.class, SortedSchemaMixin.class);
130+
}
98131
}
99132

100133
}

springdoc-openapi-starter-common/src/main/java/org/springdoc/core/utils/SpringDocAnnotationsUtils.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,8 @@ public static Schema extractSchema(Components components, Type returnType, JsonV
137137
for (Map.Entry<String, Schema> entry : schemaMap.entrySet()) {
138138
// If we've seen this schema before but find later it should be polymorphic,
139139
// replace the existing schema with this richer version.
140-
if (!componentSchemas.containsKey(entry.getKey()) || !entry.getValue().getClass().equals(componentSchemas.get(entry.getKey()).getClass())) {
141-
componentSchemas.put(entry.getKey(), entry.getValue());
140+
if (!componentSchemas.containsKey(entry.getKey()) ||
141+
(!entry.getValue().getClass().equals(componentSchemas.get(entry.getKey()).getClass()) && entry.getValue().getAllOf() != null)) { componentSchemas.put(entry.getKey(), entry.getValue());
142142
}
143143
}
144144
components.setSchemas(componentSchemas);

0 commit comments

Comments
 (0)