23
23
import java .lang .reflect .AnnotatedElement ;
24
24
import java .lang .reflect .Constructor ;
25
25
import java .lang .reflect .Executable ;
26
+ import java .lang .reflect .Field ;
26
27
import java .lang .reflect .Member ;
27
28
import java .lang .reflect .Method ;
28
29
import java .lang .reflect .Type ;
33
34
import java .util .Optional ;
34
35
35
36
import org .apache .commons .lang3 .ArrayUtils ;
37
+ import org .apache .commons .lang3 .reflect .FieldUtils ;
38
+ import org .slf4j .Logger ;
39
+ import org .slf4j .LoggerFactory ;
36
40
import org .springdoc .api .annotations .ParameterObject ;
37
41
import org .springdoc .core .converters .AdditionalModelsConverter ;
38
42
import org .springdoc .core .customizers .DelegatingMethodParameterCustomizer ;
41
45
import org .springframework .core .ParameterNameDiscoverer ;
42
46
import org .springframework .core .annotation .AnnotatedElementUtils ;
43
47
import org .springframework .lang .NonNull ;
48
+ import org .springframework .lang .Nullable ;
44
49
45
50
/**
46
51
* The type Delegating method parameter.
@@ -73,6 +78,11 @@ public class DelegatingMethodParameter extends MethodParameter {
73
78
*/
74
79
private boolean isNotRequired ;
75
80
81
+ /**
82
+ * The constant LOGGER.
83
+ */
84
+ private static final Logger LOGGER = LoggerFactory .getLogger (DelegatingMethodParameter .class );
85
+
76
86
/**
77
87
* Instantiates a new Delegating method parameter.
78
88
*
@@ -239,4 +249,27 @@ public int hashCode() {
239
249
public boolean isParameterObject () {
240
250
return isParameterObject ;
241
251
}
252
+
253
+ /**
254
+ * Return a variant of this {@code MethodParameter} which refers to the
255
+ * given containing class.
256
+ * @param containingClass a specific containing class (potentially a
257
+ * subclass of the declaring class, e.g. substituting a type variable)
258
+ * A copy of spring withContainingClass, to keep compatibility with older spring versions
259
+ * @see #getParameterType()
260
+ */
261
+ public static MethodParameter changeContainingClass (MethodParameter methodParameter , @ Nullable Class <?> containingClass ) {
262
+ MethodParameter result = methodParameter .clone ();
263
+ try {
264
+ Field containingClassField = FieldUtils .getDeclaredField (result .getClass (), "containingClass" , true );
265
+ containingClassField .set (result , containingClass );
266
+ Field parameterTypeField = FieldUtils .getDeclaredField (result .getClass (), "parameterType" , true );
267
+ parameterTypeField .set (result , null );
268
+ }
269
+ catch (IllegalAccessException e ) {
270
+ LOGGER .warn (e .getMessage ());
271
+ }
272
+ return result ;
273
+ }
274
+
242
275
}
0 commit comments