From 915dea06fca7f32c5efae848f9cc99f705c91e0e Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Mon, 14 Jul 2025 16:47:43 +0200 Subject: [PATCH] =?UTF-8?q?Use=20`getDeclaredConstructor(=E2=80=A6)`=20in?= =?UTF-8?q?=20`RepositoryBeanDefinitionReader`=20to=20avoid=20failures=20d?= =?UTF-8?q?ue=20to=20package-private=20constructors.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #3325 --- .../RepositoryBeanDefinitionReader.java | 3 ++- .../springframework/data/util/ClassUtils.java | 26 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/springframework/data/repository/config/RepositoryBeanDefinitionReader.java b/src/main/java/org/springframework/data/repository/config/RepositoryBeanDefinitionReader.java index 0da2f66d8..532848f7b 100644 --- a/src/main/java/org/springframework/data/repository/config/RepositoryBeanDefinitionReader.java +++ b/src/main/java/org/springframework/data/repository/config/RepositoryBeanDefinitionReader.java @@ -184,7 +184,8 @@ class RepositoryBeanDefinitionReader { Assert.state(beanDefinition.getBeanClassName() != null, "No Repository BeanFactory set"); Class repositoryFactoryBean = forName(beanDefinition.getBeanClassName()); - Constructor constructor = ClassUtils.getConstructorIfAvailable(repositoryFactoryBean, Class.class); + Constructor constructor = org.springframework.data.util.ClassUtils + .getDeclaredConstructorIfAvailable(repositoryFactoryBean, Class.class); if (constructor == null) { throw new IllegalStateException("No constructor accepting Class in " + repositoryFactoryBean.getName()); diff --git a/src/main/java/org/springframework/data/util/ClassUtils.java b/src/main/java/org/springframework/data/util/ClassUtils.java index 2dce18fdc..6e878779c 100644 --- a/src/main/java/org/springframework/data/util/ClassUtils.java +++ b/src/main/java/org/springframework/data/util/ClassUtils.java @@ -15,10 +15,13 @@ */ package org.springframework.data.util; +import java.lang.reflect.Constructor; import java.util.function.Consumer; import org.jspecify.annotations.Nullable; +import org.springframework.util.Assert; + /** * Utility class to work with classes. * @@ -74,4 +77,27 @@ public abstract class ClassUtils { } } + /** + * Determine whether the given class has a public constructor with the given signature, and return it if available + * (else return {@code null}). + *

+ * Essentially translates {@code NoSuchMethodException} to {@code null}. + * + * @param clazz the clazz to analyze + * @param paramTypes the parameter types of the method + * @return the constructor, or {@code null} if not found + * @see Class#getDeclaredConstructor + * @since 4.0 + */ + public static @Nullable Constructor getDeclaredConstructorIfAvailable(Class clazz, Class... paramTypes) { + + Assert.notNull(clazz, "Class must not be null"); + + try { + return clazz.getDeclaredConstructor(paramTypes); + } catch (NoSuchMethodException ex) { + return null; + } + } + }