diff --git a/src/main/java/org/springframework/data/aot/DefaultAotContext.java b/src/main/java/org/springframework/data/aot/DefaultAotContext.java index e155c27bb..923147121 100644 --- a/src/main/java/org/springframework/data/aot/DefaultAotContext.java +++ b/src/main/java/org/springframework/data/aot/DefaultAotContext.java @@ -33,6 +33,7 @@ import org.jspecify.annotations.Nullable; import org.springframework.aot.generate.GenerationContext; import org.springframework.aot.hint.MemberCategory; import org.springframework.aot.hint.TypeReference; +import org.springframework.aot.hint.annotation.ReflectiveRuntimeHintsRegistrar; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.aot.AotProcessingException; @@ -63,6 +64,7 @@ class DefaultAotContext implements AotContext { private final Map, ContextualTypeConfiguration> typeConfigurations = new HashMap<>(); private final Environment environment; + private final ReflectiveRuntimeHintsRegistrar runtimeHintsRegistrar = new ReflectiveRuntimeHintsRegistrar(); public DefaultAotContext(BeanFactory beanFactory, Environment environment) { this(beanFactory, environment, new AotMappingContext()); @@ -257,6 +259,7 @@ class DefaultAotContext implements AotContext { } if (forDataBinding) { + runtimeHintsRegistrar.registerRuntimeHints(generationContext.getRuntimeHints(), type); TypeContributor.contribute(type, Set.of(TypeContributor.DATA_NAMESPACE), generationContext); } diff --git a/src/main/java/org/springframework/data/aot/ManagedTypesBeanRegistrationAotProcessor.java b/src/main/java/org/springframework/data/aot/ManagedTypesBeanRegistrationAotProcessor.java index c5139d44d..2e978a3c1 100644 --- a/src/main/java/org/springframework/data/aot/ManagedTypesBeanRegistrationAotProcessor.java +++ b/src/main/java/org/springframework/data/aot/ManagedTypesBeanRegistrationAotProcessor.java @@ -155,7 +155,7 @@ public class ManagedTypesBeanRegistrationAotProcessor implements BeanRegistratio Set annotationNamespaces = Collections.singleton(TypeContributor.DATA_NAMESPACE); - configureTypeHints(type.toClass(), aotContext); + configureTypeContribution(type.toClass(), aotContext); TypeUtils.resolveUsedAnnotations(type.toClass()).forEach( annotation -> TypeContributor.contribute(annotation.getType(), annotationNamespaces, generationContext)); @@ -168,7 +168,7 @@ public class ManagedTypesBeanRegistrationAotProcessor implements BeanRegistratio * @param aotContext AOT context for type configuration. * @since 4.0 */ - protected void configureTypeHints(Class type, AotContext aotContext) { + protected void configureTypeContribution(Class type, AotContext aotContext) { aotContext.typeConfiguration(type, config -> config.forDataBinding().contributeAccessors().forQuerydsl()); } diff --git a/src/main/java/org/springframework/data/repository/config/RepositoryRegistrationAotProcessor.java b/src/main/java/org/springframework/data/repository/config/RepositoryRegistrationAotProcessor.java index e9f1b0a74..c5ae5d09c 100644 --- a/src/main/java/org/springframework/data/repository/config/RepositoryRegistrationAotProcessor.java +++ b/src/main/java/org/springframework/data/repository/config/RepositoryRegistrationAotProcessor.java @@ -26,12 +26,9 @@ import java.util.stream.Stream; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jspecify.annotations.Nullable; - import org.springframework.aot.generate.GenerationContext; import org.springframework.aot.hint.MemberCategory; -import org.springframework.aot.hint.RuntimeHints; import org.springframework.aot.hint.TypeReference; -import org.springframework.aot.hint.annotation.ReflectiveRuntimeHintsRegistrar; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; @@ -216,7 +213,8 @@ public class RepositoryRegistrationAotProcessor * @param generationContext the generation context. * @since 4.0 */ - private void configureTypeContributions(AotRepositoryContext repositoryContext, GenerationContext generationContext) { + protected void configureTypeContributions(AotRepositoryContext repositoryContext, + GenerationContext generationContext) { RepositoryInformation information = repositoryContext.getRepositoryInformation(); @@ -246,22 +244,17 @@ public class RepositoryRegistrationAotProcessor * @param generationContext the generation context. * @since 4.0 */ - protected void configureDomainTypeContributions(AotRepositoryContext repositoryContext, + private void configureDomainTypeContributions(AotRepositoryContext repositoryContext, GenerationContext generationContext) { RepositoryInformation information = repositoryContext.getRepositoryInformation(); - RuntimeHints hints = generationContext.getRuntimeHints(); - // Domain types, related types, projections - ReflectiveRuntimeHintsRegistrar registrar = new ReflectiveRuntimeHintsRegistrar(); Stream.concat(Stream.of(information.getDomainType()), information.getAlternativeDomainTypes().stream()) .forEach(it -> { - - registrar.registerRuntimeHints(hints, it); configureTypeContribution(it, repositoryContext); }); - // TODO: Looks like a duplicate + // Domain types my be part of this, but it also contains reachable ones. repositoryContext.getResolvedTypes().stream() .filter(it -> TypeContributor.isPartOf(it, Set.of(information.getDomainType().getPackageName()))) .forEach(it -> configureTypeContribution(it, repositoryContext));