Skip to content

Commit cd634fd

Browse files
committed
OpenAPIService is using ObjectMapper without configured modules since SpringDoc 1.6.7. Fixes #1655
1 parent 6cb2761 commit cd634fd

File tree

3 files changed

+39
-29
lines changed

3 files changed

+39
-29
lines changed

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

+3-26
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,7 @@
4848
import com.fasterxml.jackson.annotation.JsonView;
4949
import com.fasterxml.jackson.core.JsonProcessingException;
5050
import com.fasterxml.jackson.core.type.TypeReference;
51-
import com.fasterxml.jackson.databind.MapperFeature;
5251
import com.fasterxml.jackson.databind.ObjectMapper;
53-
import com.fasterxml.jackson.databind.SerializationFeature;
5452
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
5553
import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator.Feature;
5654
import io.swagger.v3.core.filter.SpecFilter;
@@ -64,7 +62,6 @@
6462
import io.swagger.v3.oas.models.PathItem;
6563
import io.swagger.v3.oas.models.PathItem.HttpMethod;
6664
import io.swagger.v3.oas.models.Paths;
67-
import io.swagger.v3.oas.models.media.Schema;
6865
import io.swagger.v3.oas.models.media.StringSchema;
6966
import io.swagger.v3.oas.models.parameters.Parameter;
7067
import io.swagger.v3.oas.models.responses.ApiResponses;
@@ -73,10 +70,6 @@
7370
import org.apache.commons.lang3.StringUtils;
7471
import org.slf4j.Logger;
7572
import org.slf4j.LoggerFactory;
76-
import org.springdoc.api.mixins.SortedOpenAPIMixin;
77-
import org.springdoc.api.mixins.SortedOpenAPIMixin31;
78-
import org.springdoc.api.mixins.SortedSchemaMixin;
79-
import org.springdoc.api.mixins.SortedSchemaMixin31;
8073
import org.springdoc.core.AbstractRequestService;
8174
import org.springdoc.core.GenericParameterService;
8275
import org.springdoc.core.GenericResponseService;
@@ -98,6 +91,7 @@
9891
import org.springdoc.core.providers.ActuatorProvider;
9992
import org.springdoc.core.providers.CloudFunctionProvider;
10093
import org.springdoc.core.providers.JavadocProvider;
94+
import org.springdoc.core.providers.ObjectMapperProvider;
10195

10296
import org.springframework.aop.support.AopUtils;
10397
import org.springframework.beans.factory.ObjectFactory;
@@ -1184,7 +1178,7 @@ protected String writeYamlValue(OpenAPI openAPI) throws JsonProcessingException
11841178
String result;
11851179
ObjectMapper objectMapper = springDocProviders.yamlMapper();
11861180
if (springDocConfigProperties.isWriterWithOrderByKeys())
1187-
sortOutput(objectMapper);
1181+
ObjectMapperProvider.sortOutput(objectMapper, springDocConfigProperties);
11881182
YAMLFactory factory = (YAMLFactory) objectMapper.getFactory();
11891183
factory.configure(Feature.USE_NATIVE_TYPE_ID, false);
11901184
if (!springDocConfigProperties.isWriterWithDefaultPrettyPrinter())
@@ -1255,7 +1249,7 @@ protected String writeJsonValue(OpenAPI openAPI) throws JsonProcessingException
12551249
String result;
12561250
ObjectMapper objectMapper = springDocProviders.jsonMapper();
12571251
if (springDocConfigProperties.isWriterWithOrderByKeys())
1258-
sortOutput(objectMapper);
1252+
ObjectMapperProvider.sortOutput(objectMapper, springDocConfigProperties);
12591253
if (!springDocConfigProperties.isWriterWithDefaultPrettyPrinter())
12601254
result = objectMapper.writerFor(OpenAPI.class).writeValueAsString(openAPI);
12611255
else
@@ -1324,23 +1318,6 @@ enum ConditionType {
13241318
HEADERS
13251319
}
13261320

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

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,8 @@ public static Schema extractSchema(Components components, Type returnType, JsonV
135135
for (Map.Entry<String, Schema> entry : schemaMap.entrySet()) {
136136
// If we've seen this schema before but find later it should be polymorphic,
137137
// replace the existing schema with this richer version.
138-
if (!componentSchemas.containsKey(entry.getKey()) || !entry.getValue().getClass().equals(componentSchemas.get(entry.getKey()).getClass())) {
138+
if (!componentSchemas.containsKey(entry.getKey()) ||
139+
(!entry.getValue().getClass().equals(componentSchemas.get(entry.getKey()).getClass()) && entry.getValue().getAllOf() != null)) {
139140
componentSchemas.put(entry.getKey(), entry.getValue());
140141
}
141142
}

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

+34-2
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,20 @@
2222

2323
package org.springdoc.core.providers;
2424

25+
import com.fasterxml.jackson.databind.MapperFeature;
2526
import com.fasterxml.jackson.databind.ObjectMapper;
27+
import com.fasterxml.jackson.databind.SerializationFeature;
2628
import io.swagger.v3.core.util.Json;
2729
import io.swagger.v3.core.util.Json31;
2830
import io.swagger.v3.core.util.ObjectMapperFactory;
2931
import io.swagger.v3.core.util.Yaml;
3032
import io.swagger.v3.core.util.Yaml31;
33+
import io.swagger.v3.oas.models.OpenAPI;
34+
import io.swagger.v3.oas.models.media.Schema;
35+
import org.springdoc.api.mixins.SortedOpenAPIMixin;
36+
import org.springdoc.api.mixins.SortedOpenAPIMixin31;
37+
import org.springdoc.api.mixins.SortedSchemaMixin;
38+
import org.springdoc.api.mixins.SortedSchemaMixin31;
3139
import org.springdoc.core.SpringDocConfigProperties;
3240
import org.springdoc.core.SpringDocConfigProperties.ApiDocs.OpenApiVersion;
3341

@@ -89,10 +97,34 @@ public ObjectMapper yamlMapper() {
8997
*/
9098
public static ObjectMapper createJson(SpringDocConfigProperties springDocConfigProperties) {
9199
OpenApiVersion openApiVersion = springDocConfigProperties.getApiDocs().getVersion();
100+
ObjectMapper objectMapper;
92101
if (openApiVersion == OpenApiVersion.OPENAPI_3_1)
93-
return ObjectMapperProvider.createJson31();
102+
objectMapper = ObjectMapperProvider.createJson31();
94103
else
95-
return ObjectMapperProvider.createJson();
104+
objectMapper = ObjectMapperProvider.createJson();
105+
106+
if (springDocConfigProperties.isWriterWithOrderByKeys())
107+
sortOutput(objectMapper, springDocConfigProperties);
108+
109+
return objectMapper;
110+
}
111+
112+
/**
113+
* Sort output.
114+
*
115+
* @param objectMapper the object mapper
116+
*/
117+
public static void sortOutput(ObjectMapper objectMapper, SpringDocConfigProperties springDocConfigProperties) {
118+
objectMapper.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true);
119+
objectMapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);
120+
if (OpenApiVersion.OPENAPI_3_1 == springDocConfigProperties.getApiDocs().getVersion()) {
121+
objectMapper.addMixIn(OpenAPI.class, SortedOpenAPIMixin31.class);
122+
objectMapper.addMixIn(Schema.class, SortedSchemaMixin31.class);
123+
}
124+
else {
125+
objectMapper.addMixIn(OpenAPI.class, SortedOpenAPIMixin.class);
126+
objectMapper.addMixIn(Schema.class, SortedSchemaMixin.class);
127+
}
96128
}
97129

98130
}

0 commit comments

Comments
 (0)