From 35401c6bad333a1a38521f4fd1c4819284dbb5e0 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Wed, 4 Jun 2025 11:20:04 +0200 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 a6dc167a03..ff69fed580 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-commons - 4.0.0-SNAPSHOT + 4.0.x-GH-3305-SNAPSHOT Spring Data Core Core Spring concepts underpinning every Spring Data module. From 84e5088b3e689c89cef6ae1bb688d1fe05456569 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Wed, 4 Jun 2025 11:38:55 +0200 Subject: [PATCH 2/3] Move off deprecated API in AOT support. --- .../data/repository/aot/hint/RepositoryRuntimeHints.java | 2 +- .../config/RepositoryRegistrationAotContribution.java | 3 +-- .../java/org/springframework/data/util/QTypeContributor.java | 2 +- .../java/org/springframework/data/util/TypeContributor.java | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/springframework/data/repository/aot/hint/RepositoryRuntimeHints.java b/src/main/java/org/springframework/data/repository/aot/hint/RepositoryRuntimeHints.java index 6b660c5cb5..7a32dd2809 100644 --- a/src/main/java/org/springframework/data/repository/aot/hint/RepositoryRuntimeHints.java +++ b/src/main/java/org/springframework/data/repository/aot/hint/RepositoryRuntimeHints.java @@ -92,7 +92,7 @@ public void registerHints(RuntimeHints hints, @Nullable ClassLoader classLoader) // hints.reflection().registerType(Throwable.class, - builder -> builder.withMembers(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS, MemberCategory.DECLARED_FIELDS)); + builder -> builder.withMembers(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS, MemberCategory.ACCESS_DECLARED_FIELDS)); // SpEL support hints.reflection().registerType( diff --git a/src/main/java/org/springframework/data/repository/config/RepositoryRegistrationAotContribution.java b/src/main/java/org/springframework/data/repository/config/RepositoryRegistrationAotContribution.java index 34b0caff52..e8e102e315 100644 --- a/src/main/java/org/springframework/data/repository/config/RepositoryRegistrationAotContribution.java +++ b/src/main/java/org/springframework/data/repository/config/RepositoryRegistrationAotContribution.java @@ -332,8 +332,7 @@ private void contributeRepositoryInfo(AotRepositoryContext repositoryContext, Ge // Kotlin if (isKotlinCoroutineRepository(repositoryContext, repositoryInformation)) { - contribution.getRuntimeHints().reflection().registerTypes(kotlinRepositoryReflectionTypeReferences(), - hint -> hint.withMembers(MemberCategory.INTROSPECT_PUBLIC_METHODS)); + contribution.getRuntimeHints().reflection().registerTypes(kotlinRepositoryReflectionTypeReferences(), hint -> {}); } // Repository query methods diff --git a/src/main/java/org/springframework/data/util/QTypeContributor.java b/src/main/java/org/springframework/data/util/QTypeContributor.java index 8447a35973..701336d799 100644 --- a/src/main/java/org/springframework/data/util/QTypeContributor.java +++ b/src/main/java/org/springframework/data/util/QTypeContributor.java @@ -50,7 +50,7 @@ public static void contributeEntityPath(Class type, GenerationContext context logger.debug("Registering Q type %s for %s."); context.getRuntimeHints().reflection().registerType(TypeReference.of(queryClassName), MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_DECLARED_CONSTRUCTORS, - MemberCategory.INTROSPECT_DECLARED_METHODS, MemberCategory.DECLARED_FIELDS); + MemberCategory.ACCESS_DECLARED_FIELDS); } else { logger.debug("Skipping Q type %s. Not an EntityPath."); } diff --git a/src/main/java/org/springframework/data/util/TypeContributor.java b/src/main/java/org/springframework/data/util/TypeContributor.java index a98672f6da..c7781dd7ac 100644 --- a/src/main/java/org/springframework/data/util/TypeContributor.java +++ b/src/main/java/org/springframework/data/util/TypeContributor.java @@ -62,7 +62,7 @@ public static void contribute(Class type, Predicate) type)) { contribution.getRuntimeHints().reflection().registerType(type, - hint -> hint.withMembers(MemberCategory.INTROSPECT_PUBLIC_METHODS)); + hint -> {}); return; } From 2891373545b9c9e8bc0f8907e4560ce3d4ae17ca Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Wed, 4 Jun 2025 11:52:13 +0200 Subject: [PATCH 3/3] Move off deprecated API --- .../data/convert/PropertyValueConverterFactories.java | 3 +-- .../springframework/data/repository/query/QueryMethod.java | 2 +- .../data/util/NullnessMethodInvocationValidator.java | 5 +++-- .../data/web/SortHandlerMethodArgumentResolverSupport.java | 3 +-- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/springframework/data/convert/PropertyValueConverterFactories.java b/src/main/java/org/springframework/data/convert/PropertyValueConverterFactories.java index 3db744e032..e030f11bb6 100644 --- a/src/main/java/org/springframework/data/convert/PropertyValueConverterFactories.java +++ b/src/main/java/org/springframework/data/convert/PropertyValueConverterFactories.java @@ -125,8 +125,7 @@ static class BeanFactoryAwarePropertyValueConverterFactory implements PropertyVa PropertyValueConverter converter = beanFactory.getBeanProvider(converterType).getIfAvailable(); if (converter == null && beanFactory instanceof AutowireCapableBeanFactory) { - return (PropertyValueConverter) ((AutowireCapableBeanFactory) beanFactory).createBean(converterType, - AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR, false); + return (PropertyValueConverter) ((AutowireCapableBeanFactory) beanFactory).createBean(converterType); } return converter; diff --git a/src/main/java/org/springframework/data/repository/query/QueryMethod.java b/src/main/java/org/springframework/data/repository/query/QueryMethod.java index b09c706345..ca3cc74a12 100644 --- a/src/main/java/org/springframework/data/repository/query/QueryMethod.java +++ b/src/main/java/org/springframework/data/repository/query/QueryMethod.java @@ -22,6 +22,7 @@ import java.util.function.Predicate; import java.util.stream.Stream; +import org.jspecify.annotations.Nullable; import org.springframework.data.domain.Limit; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -41,7 +42,6 @@ import org.springframework.data.util.ReactiveWrappers; import org.springframework.data.util.ReflectionUtils; import org.springframework.data.util.TypeInformation; -import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; diff --git a/src/main/java/org/springframework/data/util/NullnessMethodInvocationValidator.java b/src/main/java/org/springframework/data/util/NullnessMethodInvocationValidator.java index 143a055ae7..0f7d082a61 100644 --- a/src/main/java/org/springframework/data/util/NullnessMethodInvocationValidator.java +++ b/src/main/java/org/springframework/data/util/NullnessMethodInvocationValidator.java @@ -19,6 +19,7 @@ import java.lang.annotation.ElementType; import java.lang.reflect.Method; +import java.util.Arrays; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -245,8 +246,8 @@ public boolean equals(@Nullable Object o) { @Override public int hashCode() { int result = (nullableReturn ? 1 : 0); - result = (31 * result) + ObjectUtils.nullSafeHashCode(nullableParameters); - result = (31 * result) + ObjectUtils.nullSafeHashCode(methodParameters); + result = (31 * result) + Arrays.hashCode(nullableParameters); + result = (31 * result) + Arrays.hashCode(methodParameters); return result; } diff --git a/src/main/java/org/springframework/data/web/SortHandlerMethodArgumentResolverSupport.java b/src/main/java/org/springframework/data/web/SortHandlerMethodArgumentResolverSupport.java index deb9845a33..a7281e1e17 100644 --- a/src/main/java/org/springframework/data/web/SortHandlerMethodArgumentResolverSupport.java +++ b/src/main/java/org/springframework/data/web/SortHandlerMethodArgumentResolverSupport.java @@ -23,7 +23,6 @@ import java.util.function.Consumer; import org.jspecify.annotations.Nullable; - import org.springframework.core.MethodParameter; import org.springframework.core.annotation.MergedAnnotation; import org.springframework.core.annotation.MergedAnnotations; @@ -126,7 +125,7 @@ public void setFallbackSort(Sort fallbackSort) { protected Sort getDefaultFromAnnotationOrFallback(MethodParameter parameter) { MergedAnnotations mergedAnnotations = MergedAnnotations.from(parameter, parameter.getParameterAnnotations(), - RepeatableContainers.of(SortDefault.class, SortDefaults.class)); + RepeatableContainers.explicitRepeatable(SortDefault.class, SortDefaults.class)); List> annotations = mergedAnnotations.stream(SortDefault.class).toList();