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,34 @@ 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
+ 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 );
39
69
}
40
70
}
0 commit comments