15
15
*/
16
16
package org .springframework .data .repository .config ;
17
17
18
+ import java .lang .reflect .TypeVariable ;
18
19
import java .util .ArrayList ;
19
20
import java .util .Arrays ;
20
21
import java .util .Collection ;
46
47
import org .springframework .core .log .LogMessage ;
47
48
import org .springframework .core .metrics .ApplicationStartup ;
48
49
import org .springframework .core .metrics .StartupStep ;
50
+ import org .springframework .data .repository .core .RepositoryMetadata ;
51
+ import org .springframework .data .repository .core .support .AbstractRepositoryMetadata ;
49
52
import org .springframework .data .repository .core .support .RepositoryFactorySupport ;
50
53
import org .springframework .data .util .ReflectionUtils ;
51
54
import org .springframework .lang .Nullable ;
@@ -182,7 +185,6 @@ public List<BeanComponentDefinition> registerRepositoriesIn(BeanDefinitionRegist
182
185
}
183
186
184
187
RootBeanDefinition beanDefinition = (RootBeanDefinition ) definitionBuilder .getBeanDefinition ();
185
-
186
188
beanDefinition .setTargetType (getRepositoryInterface (configuration ));
187
189
beanDefinition .setResourceDescription (configuration .getResourceDescription ());
188
190
@@ -206,7 +208,7 @@ public List<BeanComponentDefinition> registerRepositoriesIn(BeanDefinitionRegist
206
208
207
209
if (logger .isInfoEnabled ()) {
208
210
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." ,
210
212
watch .lastTaskInfo ().getTimeMillis (), configurations .size (), extension .getModuleName (),
211
213
configurations .size () == 1 ? "" : "s" ));
212
214
}
@@ -325,17 +327,30 @@ private ResolvableType getRepositoryInterface(RepositoryConfiguration<?> configu
325
327
classLoader = classLoader != null ? classLoader : getClass ().getClassLoader ();
326
328
327
329
Class <?> repositoryInterface = ReflectionUtils .loadIfPresent (interfaceName , classLoader );
330
+
331
+ if (repositoryInterface == null ) {
332
+ return null ;
333
+ }
334
+
328
335
Class <?> factoryBean = ReflectionUtils .loadIfPresent (configuration .getRepositoryFactoryBeanClassName (),
329
336
classLoader );
330
337
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 );
332
345
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 ());
335
350
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 ]) ;
339
354
}
340
355
}
341
356
0 commit comments