Skip to content

Commit 78522f2

Browse files
author
bnasslahsen
committed
Merge branch 'valentinabojan-#647-register-model-converters-only-once'
2 parents f6802aa + 11fedf3 commit 78522f2

File tree

2 files changed

+34
-12
lines changed

2 files changed

+34
-12
lines changed

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

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,54 @@
2020

2121
package org.springdoc.core.converters;
2222

23+
import java.lang.reflect.Field;
2324
import java.util.List;
25+
import java.util.Optional;
2426

2527
import io.swagger.v3.core.converter.ModelConverter;
2628
import io.swagger.v3.core.converter.ModelConverters;
29+
import org.apache.commons.lang3.reflect.FieldUtils;
30+
import org.slf4j.Logger;
31+
import org.slf4j.LoggerFactory;
2732

2833
/**
2934
* Wrapper for model converters to only register converters once
3035
*/
3136
public class ModelConverterRegistrar {
3237

38+
private static final ModelConverters modelConvertersInstance = ModelConverters.getInstance();
39+
private static final Logger LOGGER = LoggerFactory.getLogger(ModelConverterRegistrar.class);
40+
3341
/**
3442
* @param modelConverters spring registered model converter beans which have to be
3543
* registered in {@link ModelConverters} instance
3644
*/
3745
public ModelConverterRegistrar(List<ModelConverter> modelConverters) {
38-
modelConverters.forEach(ModelConverters.getInstance()::addConverter);
46+
for (ModelConverter modelConverter : modelConverters) {
47+
Optional<ModelConverter> registeredConverterOptional = getRegisteredConverterSameAs(modelConverter);
48+
registeredConverterOptional.ifPresent(modelConvertersInstance::removeConverter);
49+
modelConvertersInstance.addConverter(modelConverter);
50+
}
51+
}
52+
53+
private Optional<ModelConverter> getRegisteredConverterSameAs(ModelConverter modelConverter) {
54+
try {
55+
Field convertersField = FieldUtils.getDeclaredField(ModelConverters.class, "converters", true);
56+
List<ModelConverter> modelConverters = (List<ModelConverter>) convertersField.get(modelConvertersInstance);
57+
return modelConverters.stream()
58+
.filter(registeredModelConverter -> isSameConverter(registeredModelConverter, modelConverter))
59+
.findFirst();
60+
}
61+
catch (IllegalAccessException exception) {
62+
LOGGER.error(exception.getMessage(), exception);
63+
throw new RuntimeException(exception);
64+
}
65+
}
66+
67+
private boolean isSameConverter(ModelConverter modelConverter1, ModelConverter modelConverter2) {
68+
// comparing by the converter type
69+
Class<? extends ModelConverter> modelConverter1Class = modelConverter1.getClass();
70+
Class<? extends ModelConverter> modelConverter2Class = modelConverter2.getClass();
71+
return modelConverter1Class.equals(modelConverter2Class);
3972
}
4073
}

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)