2828import org .mockito .junit .jupiter .MockitoExtension ;
2929import org .mockito .junit .jupiter .MockitoSettings ;
3030import org .mockito .quality .Strictness ;
31+
3132import org .springframework .aop .framework .Advised ;
3233import org .springframework .aot .hint .RuntimeHints ;
3334import org .springframework .beans .factory .ListableBeanFactory ;
@@ -266,6 +267,16 @@ void registersGenericsForAdditionalGenericsRepositoryFactoryBean() {
266267 assertThat (it .getGeneric (3 ).getType ()).isInstanceOf (TypeVariable .class );
267268 }
268269
270+ @ Test // GH-3074
271+ void considersGenericLength () {
272+
273+ ResolvableType it = registerBeanDefinition (IdAndEntityConstrainingFactoryBean .class );
274+
275+ assertThat (it .getGenerics ()).hasSize (2 );
276+ assertThat (it .getGeneric (0 ).resolve ()).isEqualTo (MyAnnotatedRepository .class );
277+ assertThat (it .getGeneric (1 ).resolve ()).isEqualTo (Person .class );
278+ }
279+
269280 private static ListableBeanFactory assertLazyRepositoryBeanSetup (Class <?> configClass ) {
270281
271282 var context = new AnnotationConfigApplicationContext (configClass );
@@ -329,8 +340,8 @@ private ResolvableType registerBeanDefinition(Class<?> repositoryFactoryType) {
329340 AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext ();
330341
331342 RepositoryConfigurationSource source = new AnnotationRepositoryConfigurationSource (metadata ,
332- EnableRepositories .class , context , context .getEnvironment (),
333- context . getDefaultListableBeanFactory (), new AnnotationBeanNameGenerator ()) {
343+ EnableRepositories .class , context , context .getEnvironment (), context . getDefaultListableBeanFactory (),
344+ new AnnotationBeanNameGenerator ()) {
334345
335346 @ Override
336347 public Optional <String > getRepositoryFactoryBeanClassName () {
@@ -343,10 +354,8 @@ public Optional<String> getRepositoryFactoryBeanClassName() {
343354
344355 List <BeanComponentDefinition > repositories = delegate .registerRepositoriesIn (context , extension );
345356
346- assertThat (repositories ).hasSize (1 ).element (0 )
347- .extracting (BeanComponentDefinition ::getBeanDefinition )
348- .extracting (BeanDefinition ::getResolvableType )
349- .isNotNull ();
357+ assertThat (repositories ).hasSize (1 ).element (0 ).extracting (BeanComponentDefinition ::getBeanDefinition )
358+ .extracting (BeanDefinition ::getResolvableType ).isNotNull ();
350359
351360 return repositories .get (0 ).getBeanDefinition ().getResolvableType ();
352361 }
@@ -374,4 +383,21 @@ protected AdditionalGenericsRepositoryFactoryBean(Class<? extends T> repositoryI
374383 super (repositoryInterface );
375384 }
376385 }
386+
387+ static abstract class ModuleRepositoryFactoryBean <T extends Repository <S , ID >, S , ID >
388+ extends RepositoryFactoryBeanSupport <T , S , ID > {
389+
390+ protected ModuleRepositoryFactoryBean (Class <? extends T > repositoryInterface ) {
391+ super (repositoryInterface );
392+ }
393+ }
394+
395+ static abstract class IdAndEntityConstrainingFactoryBean <R extends Repository <T , String >, T extends Person >
396+ extends RepositoryFactoryBeanSupport <R , T , String > {
397+ protected IdAndEntityConstrainingFactoryBean (Class <R > repositoryInterface ) {
398+ super (repositoryInterface );
399+ }
400+
401+ }
402+
377403}
0 commit comments