2020
2121package org .springdoc .core .converters ;
2222
23- import java .util .List ;
24-
2523import io .swagger .v3 .core .converter .ModelConverter ;
2624import 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,39 @@ 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+ if (!registeredConverterOptional .isPresent ()) {
44+ ModelConverters .getInstance ().addConverter (modelConverter );
45+ } else {
46+ registeredConverterOptional .ifPresent (alreadyRegisteredModelConverter -> {
47+ ModelConverters .getInstance ().removeConverter (alreadyRegisteredModelConverter );
48+ ModelConverters .getInstance ().addConverter (modelConverter );
49+ });
50+ }
51+ }
52+ }
53+
54+ private Optional <ModelConverter > getRegisteredConverterSameAs (ModelConverter modelConverter ) {
55+ try {
56+ Field convertersField = ModelConverters .class .getDeclaredField ("converters" );
57+ ModelConverters modelConvertersInstance = ModelConverters .getInstance ();
58+ convertersField .setAccessible (true );
59+ List <ModelConverter > modelConverters = (List <ModelConverter >) convertersField .get (modelConvertersInstance );
60+ return modelConverters .stream ()
61+ .filter (registeredModelConverter -> isSameConverter (registeredModelConverter , modelConverter ))
62+ .findFirst ();
63+ } catch (NoSuchFieldException | IllegalAccessException exception ) {
64+ throw new RuntimeException (exception );
65+ }
66+ }
67+
68+ private boolean isSameConverter (ModelConverter modelConverter1 , ModelConverter modelConverter2 ) {
69+ // for now we are comparing using the converter types which may not be what we want
70+ Class <? extends ModelConverter > modelConverter1Class = modelConverter1 .getClass ();
71+ Class <? extends ModelConverter > modelConverter2Class = modelConverter2 .getClass ();
72+
73+ return modelConverter1Class .equals (modelConverter2Class );
3974 }
4075}
0 commit comments