20
20
21
21
package org .springdoc .core .converters ;
22
22
23
- import java .util .List ;
24
-
25
23
import io .swagger .v3 .core .converter .ModelConverter ;
26
24
import io .swagger .v3 .core .converter .ModelConverters ;
27
25
26
+ import java .lang .reflect .Field ;
27
+ import java .util .List ;
28
+ import java .util .Optional ;
29
+
28
30
/**
29
31
* Wrapper for model converters to only register converters once
30
32
*/
@@ -35,6 +37,39 @@ public class ModelConverterRegistrar {
35
37
* registered in {@link ModelConverters} instance
36
38
*/
37
39
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 );
39
74
}
40
75
}
0 commit comments