Skip to content

Commit 11fedf3

Browse files
author
bnasslahsen
committed
Register model converters only if they are not registered already - fixes #647 #648
1 parent cf40851 commit 11fedf3

File tree

1 file changed

+14
-11
lines changed

1 file changed

+14
-11
lines changed

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

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,51 +20,54 @@
2020

2121
package org.springdoc.core.converters;
2222

23-
import io.swagger.v3.core.converter.ModelConverter;
24-
import io.swagger.v3.core.converter.ModelConverters;
25-
2623
import java.lang.reflect.Field;
2724
import java.util.List;
2825
import java.util.Optional;
2926

27+
import io.swagger.v3.core.converter.ModelConverter;
28+
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;
32+
3033
/**
3134
* Wrapper for model converters to only register converters once
3235
*/
3336
public class ModelConverterRegistrar {
3437

38+
private static final ModelConverters modelConvertersInstance = ModelConverters.getInstance();
39+
private static final Logger LOGGER = LoggerFactory.getLogger(ModelConverterRegistrar.class);
40+
3541
/**
3642
* @param modelConverters spring registered model converter beans which have to be
3743
* registered in {@link ModelConverters} instance
3844
*/
3945
public ModelConverterRegistrar(List<ModelConverter> modelConverters) {
4046
for (ModelConverter modelConverter : modelConverters) {
4147
Optional<ModelConverter> registeredConverterOptional = getRegisteredConverterSameAs(modelConverter);
42-
43-
ModelConverters modelConvertersInstance = ModelConverters.getInstance();
4448
registeredConverterOptional.ifPresent(modelConvertersInstance::removeConverter);
4549
modelConvertersInstance.addConverter(modelConverter);
4650
}
4751
}
4852

4953
private Optional<ModelConverter> getRegisteredConverterSameAs(ModelConverter modelConverter) {
5054
try {
51-
Field convertersField = ModelConverters.class.getDeclaredField("converters");
52-
ModelConverters modelConvertersInstance = ModelConverters.getInstance();
53-
convertersField.setAccessible(true);
55+
Field convertersField = FieldUtils.getDeclaredField(ModelConverters.class, "converters", true);
5456
List<ModelConverter> modelConverters = (List<ModelConverter>) convertersField.get(modelConvertersInstance);
5557
return modelConverters.stream()
5658
.filter(registeredModelConverter -> isSameConverter(registeredModelConverter, modelConverter))
5759
.findFirst();
58-
} catch (NoSuchFieldException | IllegalAccessException exception) {
60+
}
61+
catch (IllegalAccessException exception) {
62+
LOGGER.error(exception.getMessage(), exception);
5963
throw new RuntimeException(exception);
6064
}
6165
}
6266

6367
private boolean isSameConverter(ModelConverter modelConverter1, ModelConverter modelConverter2) {
64-
// for now we are comparing using the converter types which may not be what we want
68+
// comparing by the converter type
6569
Class<? extends ModelConverter> modelConverter1Class = modelConverter1.getClass();
6670
Class<? extends ModelConverter> modelConverter2Class = modelConverter2.getClass();
67-
6871
return modelConverter1Class.equals(modelConverter2Class);
6972
}
7073
}

0 commit comments

Comments
 (0)