From a2b36155722048986baef57433f14bb7a5848296 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Tue, 6 Dec 2022 14:41:59 +0100 Subject: [PATCH] Exclude local and anonymous classes from AOT type inspection. Also update the type filter that would not mach types directly present in the given package. Modify type contribution method to allow store specific override. Closes: #2744 Original pull request: #2746 --- .../config/RepositoryRegistrationAotProcessor.java | 6 +++--- .../org/springframework/data/util/TypeCollector.java | 12 +++++++----- .../data/aot/TypeCollectorUnitTests.java | 5 +++++ 3 files changed, 15 insertions(+), 8 deletions(-) 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 f518bdda5..7b19a34fc 100644 --- a/src/main/java/org/springframework/data/repository/config/RepositoryRegistrationAotProcessor.java +++ b/src/main/java/org/springframework/data/repository/config/RepositoryRegistrationAotProcessor.java @@ -82,11 +82,11 @@ public class RepositoryRegistrationAotProcessor implements BeanRegistrationAotPr repositoryContext.getResolvedTypes().stream() .filter(it -> !RepositoryRegistrationAotContribution.isJavaOrPrimitiveType(it)) - .forEach(it -> RepositoryRegistrationAotProcessor.contributeType(it, generationContext)); + .forEach(it -> contributeType(it, generationContext)); repositoryContext.getResolvedAnnotations().stream() .filter(RepositoryRegistrationAotProcessor::isSpringDataManagedAnnotation).map(MergedAnnotation::getType) - .forEach(it -> RepositoryRegistrationAotProcessor.contributeType(it, generationContext)); + .forEach(it -> contributeType(it, generationContext)); } private boolean isRepositoryBean(RegisteredBean bean) { @@ -167,7 +167,7 @@ public class RepositoryRegistrationAotProcessor implements BeanRegistrationAotPr || annotation.getMetaTypes().stream().anyMatch(RepositoryRegistrationAotProcessor::isInSpringDataNamespace)); } - private static void contributeType(Class type, GenerationContext generationContext) { + protected void contributeType(Class type, GenerationContext generationContext) { TypeContributor.contribute(type, it -> true, generationContext); } diff --git a/src/main/java/org/springframework/data/util/TypeCollector.java b/src/main/java/org/springframework/data/util/TypeCollector.java index 1fe74ea6a..ae934d2c2 100644 --- a/src/main/java/org/springframework/data/util/TypeCollector.java +++ b/src/main/java/org/springframework/data/util/TypeCollector.java @@ -48,16 +48,18 @@ public class TypeCollector { private static final Log logger = LogFactory.getLog(TypeCollector.class); - static final Set EXCLUDED_DOMAINS = new HashSet<>(Arrays.asList("java", "sun.", "jdk.", "reactor.", - "kotlinx.", "kotlin.", "org.springframework.core.", "org.springframework.data.mapping.", - "org.springframework.data.repository.", "org.springframework.boot.", "org.springframework.core.")); + static final Set EXCLUDED_DOMAINS = new HashSet<>( + Arrays.asList("java", "sun.", "jdk.", "reactor.", "kotlinx.", "kotlin.", "org.springframework.core.", + "org.springframework.data.mapping.", "org.springframework.data.repository.", "org.springframework.boot.", + "org.springframework.context.", "org.springframework.beans.")); private final Predicate> excludedDomainsFilter = type -> { - String packageName = type.getPackageName(); + String packageName = type.getPackageName() + "."; return EXCLUDED_DOMAINS.stream().noneMatch(packageName::startsWith); }; - private Predicate> typeFilter = excludedDomainsFilter; + private Predicate> typeFilter = excludedDomainsFilter + .and(it -> !it.isLocalClass() && !it.isAnonymousClass()); private final Predicate methodFilter = createMethodFilter(); diff --git a/src/test/java/org/springframework/data/aot/TypeCollectorUnitTests.java b/src/test/java/org/springframework/data/aot/TypeCollectorUnitTests.java index c2bfd8bc5..a81f28ef3 100644 --- a/src/test/java/org/springframework/data/aot/TypeCollectorUnitTests.java +++ b/src/test/java/org/springframework/data/aot/TypeCollectorUnitTests.java @@ -61,4 +61,9 @@ public class TypeCollectorUnitTests { WithDeclaredClass.SomeEnum.class); } + @Test // GH-2744 + void skipsCoreFrameworkType() { + assertThat(TypeCollector.inspect(org.springframework.core.AliasRegistry.class).list()).isEmpty(); + } + }