Support advanced generics redeclarations in RepositoryFactoryBeanSupport extensions.

Spring Data modules might override, and, by that, fix some of the generic type parameters exposed by RepositoryFactoryBeanSupport. We now more thoroughly walk through them to consider the ones expanded already and automatically expand the remaining ones with either the types found on the user repository interface or the unresolved type variable.

Ticket: GH-3074.
This commit is contained in:
Oliver Drotbohm
2024-04-09 19:20:28 +02:00
parent 36e60d80e0
commit d22bb69a46
2 changed files with 71 additions and 15 deletions

View File

@@ -343,19 +343,28 @@ public class RepositoryConfigurationDelegate {
RepositoryMetadata metadata = AbstractRepositoryMetadata.getMetadata(repositoryInterface);
List<Class<?>> types = List.of(repositoryInterface, metadata.getDomainType(), metadata.getIdType());
ResolvableType factoryBeanType = ResolvableType.forClass(RepositoryFactoryBeanSupport.class, factoryBean);
ResolvableType[] factoryGenerics = factoryBeanType.getGenerics();
ResolvableType[] declaredGenerics = ResolvableType.forClass(factoryBean).getGenerics();
ResolvableType[] parentGenerics = ResolvableType.forClass(RepositoryFactoryBeanSupport.class, factoryBean)
.getGenerics();
List<ResolvableType> resolvedGenerics = new ArrayList<ResolvableType>(factoryBean.getTypeParameters().length);
for (int i = 0; i < factoryGenerics.length; i++) {
ResolvableType parameter = factoryGenerics[i];
for (int i = 0; i < parentGenerics.length; i++) {
if (parameter.getType() instanceof TypeVariable<?> && i < types.size()) {
factoryGenerics[i] = ResolvableType.forClass(types.get(i));
ResolvableType parameter = parentGenerics[i];
if (parameter.getType() instanceof TypeVariable<?>) {
resolvedGenerics.add(i < types.size() ? ResolvableType.forClass(types.get(i)) : parameter);
}
}
return ResolvableType.forClassWithGenerics(factoryBean, factoryGenerics);
if (resolvedGenerics.size() < declaredGenerics.length) {
for (int j = parentGenerics.length; j < declaredGenerics.length; j++) {
resolvedGenerics.add(declaredGenerics[j]);
}
}
return ResolvableType.forClassWithGenerics(factoryBean, resolvedGenerics.toArray(ResolvableType[]::new));
}
/**