2323import java .lang .reflect .AnnotatedElement ;
2424import java .lang .reflect .Constructor ;
2525import java .lang .reflect .Executable ;
26+ import java .lang .reflect .Field ;
2627import java .lang .reflect .Member ;
2728import java .lang .reflect .Method ;
2829import java .lang .reflect .Type ;
3334import java .util .Optional ;
3435
3536import org .apache .commons .lang3 .ArrayUtils ;
37+ import org .apache .commons .lang3 .reflect .FieldUtils ;
38+ import org .slf4j .Logger ;
39+ import org .slf4j .LoggerFactory ;
3640import org .springdoc .api .annotations .ParameterObject ;
3741import org .springdoc .core .converters .AdditionalModelsConverter ;
3842import org .springdoc .core .customizers .DelegatingMethodParameterCustomizer ;
4145import org .springframework .core .ParameterNameDiscoverer ;
4246import org .springframework .core .annotation .AnnotatedElementUtils ;
4347import org .springframework .lang .NonNull ;
48+ import org .springframework .lang .Nullable ;
4449
4550/**
4651 * The type Delegating method parameter.
@@ -73,6 +78,11 @@ public class DelegatingMethodParameter extends MethodParameter {
7378 */
7479 private boolean isNotRequired ;
7580
81+ /**
82+ * The constant LOGGER.
83+ */
84+ private static final Logger LOGGER = LoggerFactory .getLogger (DelegatingMethodParameter .class );
85+
7686 /**
7787 * Instantiates a new Delegating method parameter.
7888 *
@@ -239,4 +249,27 @@ public int hashCode() {
239249 public boolean isParameterObject () {
240250 return isParameterObject ;
241251 }
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+
242275}
0 commit comments