1515 */
1616package org .springframework .data .repository .config ;
1717
18+ import java .lang .reflect .TypeVariable ;
1819import java .util .ArrayList ;
1920import java .util .Arrays ;
2021import java .util .Collection ;
4647import org .springframework .core .log .LogMessage ;
4748import org .springframework .core .metrics .ApplicationStartup ;
4849import org .springframework .core .metrics .StartupStep ;
50+ import org .springframework .data .repository .core .RepositoryMetadata ;
51+ import org .springframework .data .repository .core .support .AbstractRepositoryMetadata ;
4952import org .springframework .data .repository .core .support .RepositoryFactorySupport ;
5053import org .springframework .data .util .ReflectionUtils ;
5154import org .springframework .lang .Nullable ;
@@ -182,7 +185,6 @@ public List<BeanComponentDefinition> registerRepositoriesIn(BeanDefinitionRegist
182185 }
183186
184187 RootBeanDefinition beanDefinition = (RootBeanDefinition ) definitionBuilder .getBeanDefinition ();
185-
186188 beanDefinition .setTargetType (getRepositoryInterface (configuration ));
187189 beanDefinition .setResourceDescription (configuration .getResourceDescription ());
188190
@@ -206,7 +208,7 @@ public List<BeanComponentDefinition> registerRepositoriesIn(BeanDefinitionRegist
206208
207209 if (logger .isInfoEnabled ()) {
208210 logger .info (
209- LogMessage .format ("Finished Spring Data repository scanning in %s ms. Found %s %s repository interface%s." ,
211+ LogMessage .format ("Finished Spring Data repository scanning in %s ms. Found %s %s repository interface%s." ,
210212 watch .lastTaskInfo ().getTimeMillis (), configurations .size (), extension .getModuleName (),
211213 configurations .size () == 1 ? "" : "s" ));
212214 }
@@ -325,17 +327,30 @@ private ResolvableType getRepositoryInterface(RepositoryConfiguration<?> configu
325327 classLoader = classLoader != null ? classLoader : getClass ().getClassLoader ();
326328
327329 Class <?> repositoryInterface = ReflectionUtils .loadIfPresent (interfaceName , classLoader );
330+
331+ if (repositoryInterface == null ) {
332+ return null ;
333+ }
334+
328335 Class <?> factoryBean = ReflectionUtils .loadIfPresent (configuration .getRepositoryFactoryBeanClassName (),
329336 classLoader );
330337
331- int numberOfGenerics = factoryBean .getTypeParameters ().length ;
338+ if (factoryBean == null ) {
339+ return null ;
340+ }
341+
342+ TypeVariable <?>[] variables = factoryBean .getTypeParameters ();
343+ int numberOfGenerics = variables .length ;
344+ RepositoryMetadata metadata = AbstractRepositoryMetadata .getMetadata (repositoryInterface );
332345
333- Class <?>[] generics = new Class <?>[numberOfGenerics ];
334- generics [0 ] = repositoryInterface ;
346+ ResolvableType [] generics = new ResolvableType [numberOfGenerics ];
347+ generics [0 ] = ResolvableType .forClass (repositoryInterface );
348+ generics [1 ] = ResolvableType .forClass (metadata .getDomainType ());
349+ generics [2 ] = ResolvableType .forClass (metadata .getIdType ());
335350
336- if (numberOfGenerics > 1 ) {
337- for (int i = 1 ; i < numberOfGenerics ; i ++) {
338- generics [i ] = Object . class ;
351+ if (numberOfGenerics > 3 ) {
352+ for (int i = 3 ; i < numberOfGenerics ; i ++) {
353+ generics [i ] = ResolvableType . forType ( variables [ 0 ]) ;
339354 }
340355 }
341356
0 commit comments