|
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