Skip to content

Commit cf40851

Browse files
author
bnasslahsen
committed
Merge branch '#647-register-model-converters-only-once' of https://github.com/valentinabojan/springdoc-openapi into valentinabojan-#647-register-model-converters-only-once
2 parents f6802aa + 4ca4dce commit cf40851

File tree

2 files changed

+33
-14
lines changed

2 files changed

+33
-14
lines changed

springdoc-openapi-common/src/main/java/org/springdoc/core/converters/ModelConverterRegistrar.java

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,13 @@
2020

2121
package org.springdoc.core.converters;
2222

23-
import java.util.List;
24-
2523
import io.swagger.v3.core.converter.ModelConverter;
2624
import io.swagger.v3.core.converter.ModelConverters;
2725

26+
import java.lang.reflect.Field;
27+
import java.util.List;
28+
import java.util.Optional;
29+
2830
/**
2931
* Wrapper for model converters to only register converters once
3032
*/
@@ -35,6 +37,34 @@ public class ModelConverterRegistrar {
3537
* registered in {@link ModelConverters} instance
3638
*/
3739
public ModelConverterRegistrar(List<ModelConverter> modelConverters) {
38-
modelConverters.forEach(ModelConverters.getInstance()::addConverter);
40+
for (ModelConverter modelConverter : modelConverters) {
41+
Optional<ModelConverter> registeredConverterOptional = getRegisteredConverterSameAs(modelConverter);
42+
43+
ModelConverters modelConvertersInstance = ModelConverters.getInstance();
44+
registeredConverterOptional.ifPresent(modelConvertersInstance::removeConverter);
45+
modelConvertersInstance.addConverter(modelConverter);
46+
}
47+
}
48+
49+
private Optional<ModelConverter> getRegisteredConverterSameAs(ModelConverter modelConverter) {
50+
try {
51+
Field convertersField = ModelConverters.class.getDeclaredField("converters");
52+
ModelConverters modelConvertersInstance = ModelConverters.getInstance();
53+
convertersField.setAccessible(true);
54+
List<ModelConverter> modelConverters = (List<ModelConverter>) convertersField.get(modelConvertersInstance);
55+
return modelConverters.stream()
56+
.filter(registeredModelConverter -> isSameConverter(registeredModelConverter, modelConverter))
57+
.findFirst();
58+
} catch (NoSuchFieldException | IllegalAccessException exception) {
59+
throw new RuntimeException(exception);
60+
}
61+
}
62+
63+
private boolean isSameConverter(ModelConverter modelConverter1, ModelConverter modelConverter2) {
64+
// for now we are comparing using the converter types which may not be what we want
65+
Class<? extends ModelConverter> modelConverter1Class = modelConverter1.getClass();
66+
Class<? extends ModelConverter> modelConverter2Class = modelConverter2.getClass();
67+
68+
return modelConverter1Class.equals(modelConverter2Class);
3969
}
4070
}

springdoc-openapi-data-rest/src/test/java/test/org/springdoc/api/AbstractSpringDocTest.java

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,7 @@
2222
import java.nio.file.Files;
2323
import java.nio.file.Path;
2424
import java.nio.file.Paths;
25-
import java.util.List;
2625

27-
import io.swagger.v3.core.converter.ModelConverter;
28-
import io.swagger.v3.core.converter.ModelConverters;
2926
import nonapi.io.github.classgraph.utils.FileUtils;
3027
import org.junit.jupiter.api.AfterAll;
3128
import org.junit.jupiter.api.Test;
@@ -57,8 +54,6 @@ public abstract class AbstractSpringDocTest {
5754

5855
public static String className;
5956

60-
private static List<ModelConverter> modelConverters;
61-
6257
@Autowired
6358
protected MockMvc mockMvc;
6459

@@ -75,16 +70,10 @@ public static String getContent(String fileName) throws Exception {
7570

7671
@AfterAll
7772
public static void afterClass() {
78-
modelConverters.forEach(ModelConverters.getInstance()::removeConverter);
7973
System.clearProperty("spring.hateoas.use-hal-as-default-json-media-type");
8074
getConfig().replaceWithClass(org.springframework.data.domain.Pageable.class, Pageable.class);
8175
}
8276

83-
@Autowired
84-
private void setModelConverters(List<ModelConverter> modelConverters) {
85-
AbstractSpringDocTest.modelConverters = modelConverters;
86-
}
87-
8877
@Test
8978
public void testApp() throws Exception {
9079
className = getClass().getSimpleName();

0 commit comments

Comments
 (0)