From 3983501953c621a09b19264adb7aedf9de7ce84a Mon Sep 17 00:00:00 2001 From: Olga Maciaszek-Sharma Date: Mon, 13 May 2024 16:56:35 +0200 Subject: [PATCH] Register hints for superinterface methods. (#1030) --- ...entBeanFactoryInitializationAotProcessor.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/aot/FeignClientBeanFactoryInitializationAotProcessor.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/aot/FeignClientBeanFactoryInitializationAotProcessor.java index f02d36f41..ed47fbdc6 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/aot/FeignClientBeanFactoryInitializationAotProcessor.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/aot/FeignClientBeanFactoryInitializationAotProcessor.java @@ -28,6 +28,7 @@ import org.springframework.aot.generate.GenerationContext; import org.springframework.aot.generate.MethodReference; import org.springframework.aot.hint.BindingReflectionHintsRegistrar; +import org.springframework.aot.hint.MemberCategory; import org.springframework.aot.hint.ReflectionHints; import org.springframework.aot.hint.RuntimeHints; import org.springframework.beans.MutablePropertyValues; @@ -107,6 +108,21 @@ private void registerMethodHints(ReflectionHints hints, Class clazz) { for (Method method : clazz.getMethods()) { registerMethodHints(hints, method); } + introspectPublicMethodsOnAllInterfaces(hints, clazz); + } + + // from Spring Framework BeanRegistrationsAotContribution + private void introspectPublicMethodsOnAllInterfaces(ReflectionHints hints, Class clazz) { + Class currentClass = clazz; + while (currentClass != null && currentClass != Object.class) { + for (Class interfaceType : currentClass.getInterfaces()) { + if (!ClassUtils.isJavaLanguageInterface(interfaceType)) { + hints.registerType(interfaceType, MemberCategory.INTROSPECT_PUBLIC_METHODS); + introspectPublicMethodsOnAllInterfaces(hints, interfaceType); + } + } + currentClass = currentClass.getSuperclass(); + } } private void registerMethodHints(ReflectionHints hints, Method method) {