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,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}
0 commit comments