|
20 | 20 |
|
21 | 21 | package org.springdoc.core.converters; |
22 | 22 |
|
23 | | -import io.swagger.v3.core.converter.ModelConverter; |
24 | | -import io.swagger.v3.core.converter.ModelConverters; |
25 | | - |
26 | 23 | import java.lang.reflect.Field; |
27 | 24 | import java.util.List; |
28 | 25 | import java.util.Optional; |
29 | 26 |
|
| 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 | + |
30 | 33 | /** |
31 | 34 | * Wrapper for model converters to only register converters once |
32 | 35 | */ |
33 | 36 | public class ModelConverterRegistrar { |
34 | 37 |
|
| 38 | + private static final ModelConverters modelConvertersInstance = ModelConverters.getInstance(); |
| 39 | + private static final Logger LOGGER = LoggerFactory.getLogger(ModelConverterRegistrar.class); |
| 40 | + |
35 | 41 | /** |
36 | 42 | * @param modelConverters spring registered model converter beans which have to be |
37 | 43 | * registered in {@link ModelConverters} instance |
38 | 44 | */ |
39 | 45 | public ModelConverterRegistrar(List<ModelConverter> modelConverters) { |
40 | 46 | for (ModelConverter modelConverter : modelConverters) { |
41 | 47 | Optional<ModelConverter> registeredConverterOptional = getRegisteredConverterSameAs(modelConverter); |
42 | | - |
43 | | - ModelConverters modelConvertersInstance = ModelConverters.getInstance(); |
44 | 48 | registeredConverterOptional.ifPresent(modelConvertersInstance::removeConverter); |
45 | 49 | modelConvertersInstance.addConverter(modelConverter); |
46 | 50 | } |
47 | 51 | } |
48 | 52 |
|
49 | 53 | private Optional<ModelConverter> getRegisteredConverterSameAs(ModelConverter modelConverter) { |
50 | 54 | 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); |
54 | 56 | List<ModelConverter> modelConverters = (List<ModelConverter>) convertersField.get(modelConvertersInstance); |
55 | 57 | return modelConverters.stream() |
56 | 58 | .filter(registeredModelConverter -> isSameConverter(registeredModelConverter, modelConverter)) |
57 | 59 | .findFirst(); |
58 | | - } catch (NoSuchFieldException | IllegalAccessException exception) { |
| 60 | + } |
| 61 | + catch (IllegalAccessException exception) { |
| 62 | + LOGGER.error(exception.getMessage(), exception); |
59 | 63 | throw new RuntimeException(exception); |
60 | 64 | } |
61 | 65 | } |
62 | 66 |
|
63 | 67 | 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 |
65 | 69 | Class<? extends ModelConverter> modelConverter1Class = modelConverter1.getClass(); |
66 | 70 | Class<? extends ModelConverter> modelConverter2Class = modelConverter2.getClass(); |
67 | | - |
68 | 71 | return modelConverter1Class.equals(modelConverter2Class); |
69 | 72 | } |
70 | 73 | } |
0 commit comments