Polish reflection hints on bean registration interfaces
This commit ensures that we register reflection hints on interfaces in the entire type hierarchy. Closes gh-31350
This commit is contained in:
		
							parent
							
								
									b832df6087
								
							
						
					
					
						commit
						1fd54912d2
					
				|  | @ -36,6 +36,7 @@ import org.springframework.core.ResolvableType; | ||||||
| import org.springframework.javapoet.ClassName; | import org.springframework.javapoet.ClassName; | ||||||
| import org.springframework.javapoet.CodeBlock; | import org.springframework.javapoet.CodeBlock; | ||||||
| import org.springframework.javapoet.MethodSpec; | import org.springframework.javapoet.MethodSpec; | ||||||
|  | import org.springframework.util.ClassUtils; | ||||||
| import org.springframework.util.ReflectionUtils; | import org.springframework.util.ReflectionUtils; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  | @ -118,9 +119,15 @@ class BeanRegistrationsAotContribution | ||||||
| 			ReflectionHints hints = runtimeHints.reflection(); | 			ReflectionHints hints = runtimeHints.reflection(); | ||||||
| 			Class<?> beanClass = beanRegistrationKey.beanClass(); | 			Class<?> beanClass = beanRegistrationKey.beanClass(); | ||||||
| 			hints.registerType(beanClass, MemberCategory.INTROSPECT_PUBLIC_METHODS, MemberCategory.INTROSPECT_DECLARED_METHODS); | 			hints.registerType(beanClass, MemberCategory.INTROSPECT_PUBLIC_METHODS, MemberCategory.INTROSPECT_DECLARED_METHODS); | ||||||
| 			for (Class<?> interfaceType : beanClass.getInterfaces()) { | 			Class<?> currentClass = beanClass; | ||||||
|  | 			while (currentClass != null && currentClass != Object.class) { | ||||||
|  | 				for (Class<?> interfaceType : currentClass.getInterfaces()) { | ||||||
|  | 					if (!ClassUtils.isJavaLanguageInterface(interfaceType)) { | ||||||
| 						hints.registerType(interfaceType, MemberCategory.INTROSPECT_PUBLIC_METHODS); | 						hints.registerType(interfaceType, MemberCategory.INTROSPECT_PUBLIC_METHODS); | ||||||
| 					} | 					} | ||||||
|  | 				} | ||||||
|  | 				currentClass = currentClass.getSuperclass(); | ||||||
|  | 			} | ||||||
| 			// Workaround for https://github.com/oracle/graal/issues/6510 | 			// Workaround for https://github.com/oracle/graal/issues/6510 | ||||||
| 			if (beanClass.isRecord()) { | 			if (beanClass.isRecord()) { | ||||||
| 				hints.registerType(beanClass, MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_DECLARED_METHODS); | 				hints.registerType(beanClass, MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_DECLARED_METHODS); | ||||||
|  |  | ||||||
|  | @ -36,7 +36,9 @@ import org.springframework.beans.factory.aot.BeanRegistrationsAotContribution.Re | ||||||
| import org.springframework.beans.factory.support.DefaultListableBeanFactory; | import org.springframework.beans.factory.support.DefaultListableBeanFactory; | ||||||
| import org.springframework.beans.factory.support.RegisteredBean; | import org.springframework.beans.factory.support.RegisteredBean; | ||||||
| import org.springframework.beans.factory.support.RootBeanDefinition; | import org.springframework.beans.factory.support.RootBeanDefinition; | ||||||
|  | import org.springframework.beans.testfixture.beans.Employee; | ||||||
| import org.springframework.beans.testfixture.beans.GenericBeanWithBounds; | import org.springframework.beans.testfixture.beans.GenericBeanWithBounds; | ||||||
|  | import org.springframework.beans.testfixture.beans.ITestBean; | ||||||
| import org.springframework.beans.testfixture.beans.Person; | import org.springframework.beans.testfixture.beans.Person; | ||||||
| import org.springframework.beans.testfixture.beans.RecordBean; | import org.springframework.beans.testfixture.beans.RecordBean; | ||||||
| import org.springframework.beans.testfixture.beans.TestBean; | import org.springframework.beans.testfixture.beans.TestBean; | ||||||
|  | @ -141,20 +143,18 @@ class BeanRegistrationsAotContributionTests { | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	void applyToRegisterReflectionHints() { | 	void applyToRegisterReflectionHints() { | ||||||
| 		RegisteredBean registeredBean = registerBean(new RootBeanDefinition(TestBean.class)); | 		RegisteredBean registeredBean = registerBean(new RootBeanDefinition(Employee.class)); | ||||||
| 		BeanDefinitionMethodGenerator generator = new BeanDefinitionMethodGenerator(this.methodGeneratorFactory, | 		BeanDefinitionMethodGenerator generator = new BeanDefinitionMethodGenerator(this.methodGeneratorFactory, | ||||||
| 				registeredBean, null, List.of()); | 				registeredBean, null, List.of()); | ||||||
| 		BeanRegistrationsAotContribution contribution = createContribution(TestBean.class, generator); | 		BeanRegistrationsAotContribution contribution = createContribution(Employee.class, generator); | ||||||
| 		contribution.applyTo(this.generationContext, this.beanFactoryInitializationCode); | 		contribution.applyTo(this.generationContext, this.beanFactoryInitializationCode); | ||||||
| 		assertThat(reflection().onType(TestBean.class) | 		assertThat(reflection().onType(Employee.class) | ||||||
| 				.withMemberCategories(MemberCategory.INTROSPECT_PUBLIC_METHODS, MemberCategory.INTROSPECT_DECLARED_METHODS)) | 				.withMemberCategories(MemberCategory.INTROSPECT_PUBLIC_METHODS, MemberCategory.INTROSPECT_DECLARED_METHODS)) | ||||||
| 				.accepts(this.generationContext.getRuntimeHints()); | 				.accepts(this.generationContext.getRuntimeHints()); | ||||||
| 		for (Class<?> interfaceType : TestBean.class.getInterfaces()) { | 		assertThat(reflection().onType(ITestBean.class) | ||||||
| 			assertThat(reflection().onType(interfaceType) |  | ||||||
| 				.withMemberCategory(MemberCategory.INTROSPECT_PUBLIC_METHODS)) | 				.withMemberCategory(MemberCategory.INTROSPECT_PUBLIC_METHODS)) | ||||||
| 				.accepts(this.generationContext.getRuntimeHints()); | 				.accepts(this.generationContext.getRuntimeHints()); | ||||||
| 	} | 	} | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	void applyToRegisterReflectionHintsOnRecordBean() { | 	void applyToRegisterReflectionHintsOnRecordBean() { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue