From b51e1cb5b7422e38a3818a957dcee4b54fe3fc5b Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Tue, 6 Dec 2022 14:40:12 +0100 Subject: [PATCH 1/3] Prepare issue branch. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 13bf0377b4..f068127bea 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-commons - 3.1.0-SNAPSHOT + 3.1.x-2744-SNAPSHOT Spring Data Core Core Spring concepts underpinning every Spring Data module. From a382350100060b323e84f0badbdfe46c2d623a28 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Tue, 6 Dec 2022 14:41:59 +0100 Subject: [PATCH 2/3] Exclude local & anonymous classes from 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. --- .../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 3184ae28a7..cc1bdf3044 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 @@ protected void contribute(AotRepositoryContext repositoryContext, GenerationCont 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 @@ private static boolean isSpringDataManagedAnnotation(@Nullable MergedAnnotation< || 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 4d18f61fa8..60f97187b8 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 5a8b6b0620..49cc6ca356 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 @@ void includesDeclaredClassesInInspection() { WithDeclaredClass.SomeEnum.class); } + @Test // GH-2744 + void skipsCoreFrameworkType() { + assertThat(TypeCollector.inspect(org.springframework.core.AliasRegistry.class).list()).isEmpty(); + } + } From cea9abd928bcc24745cfda8258eee79b6d33e371 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Wed, 7 Dec 2022 13:09:00 +0100 Subject: [PATCH 3/3] Exclude synthetic constructors from inspection. Java8 bytecode may contain synthetic constructors that refer to anonymous classes which should not be inspected. Eg. the following construct results in bytecode as listed further down below. public enum Outer { INSTANCE { @Override public Inner getInnerType() { return Inner.STANDALONE; } }, public abstract Inner getInnerType(); } synthetic Outer(java.lang.String arg0, int arg1, Inner$1 arg2) --- .../java/org/springframework/data/util/TypeCollector.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/org/springframework/data/util/TypeCollector.java b/src/main/java/org/springframework/data/util/TypeCollector.java index 60f97187b8..1d978f0fb8 100644 --- a/src/main/java/org/springframework/data/util/TypeCollector.java +++ b/src/main/java/org/springframework/data/util/TypeCollector.java @@ -127,6 +127,10 @@ Set visitConstructorsOfType(ResolvableType type) { } Set discoveredTypes = new LinkedHashSet<>(); for (Constructor constructor : type.toClass().getDeclaredConstructors()) { + + if (constructor.isSynthetic()) { + continue; + } for (Class signatureType : TypeUtils.resolveTypesInSignature(type.toClass(), constructor)) { if (typeFilter.test(signatureType)) { discoveredTypes.add(signatureType);