1717
1818import  static  org .assertj .core .api .Assertions .*;
1919
20+ import  java .lang .reflect .TypeVariable ;
2021import  java .util .List ;
2122import  java .util .Optional ;
2223import  java .util .UUID ;
3940import  org .springframework .context .annotation .ComponentScan .Filter ;
4041import  org .springframework .context .annotation .FilterType ;
4142import  org .springframework .context .support .GenericApplicationContext ;
43+ import  org .springframework .core .ResolvableType ;
4244import  org .springframework .core .env .StandardEnvironment ;
4345import  org .springframework .core .metrics .ApplicationStartup ;
4446import  org .springframework .core .type .AnnotationMetadata ;
@@ -232,6 +234,38 @@ void registersAotPostProcessorForDifferentConfigurations() {
232234		assertThat (context .getBeanNamesForType (RepositoryRegistrationAotProcessor .class )).hasSize (2 );
233235	}
234236
237+ 	@ Test  // GH-3074 
238+ 	void  registersGenericsForIdConstrainingRepositoryFactoryBean () {
239+ 
240+ 		ResolvableType  it  = registerBeanDefinition (IdConstrainingRepositoryFactoryBean .class );
241+ 
242+ 		assertThat (it .getGenerics ()).hasSize (2 );
243+ 		assertThat (it .getGeneric (0 ).resolve ()).isEqualTo (MyAnnotatedRepository .class );
244+ 		assertThat (it .getGeneric (1 ).resolve ()).isEqualTo (Person .class );
245+ 	}
246+ 
247+ 	@ Test  // GH-3074 
248+ 	void  registersGenericsForDomainTypeConstrainingRepositoryFactoryBean () {
249+ 
250+ 		ResolvableType  it  = registerBeanDefinition (DomainTypeConstrainingRepositoryFactoryBean .class );
251+ 
252+ 		assertThat (it .getGenerics ()).hasSize (2 );
253+ 		assertThat (it .getGeneric (0 ).resolve ()).isEqualTo (MyAnnotatedRepository .class );
254+ 		assertThat (it .getGeneric (1 ).resolve ()).isEqualTo (String .class );
255+ 	}
256+ 
257+ 	@ Test  // GH-3074 
258+ 	void  registersGenericsForAdditionalGenericsRepositoryFactoryBean () {
259+ 
260+ 		ResolvableType  it  = registerBeanDefinition (AdditionalGenericsRepositoryFactoryBean .class );
261+ 
262+ 		assertThat (it .getGenerics ()).hasSize (4 );
263+ 		assertThat (it .getGeneric (0 ).resolve ()).isEqualTo (MyAnnotatedRepository .class );
264+ 		assertThat (it .getGeneric (1 ).resolve ()).isEqualTo (Person .class );
265+ 		assertThat (it .getGeneric (2 ).resolve ()).isEqualTo (String .class );
266+ 		assertThat (it .getGeneric (3 ).getType ()).isInstanceOf (TypeVariable .class );
267+ 	}
268+ 
235269	private  static  ListableBeanFactory  assertLazyRepositoryBeanSetup (Class <?> configClass ) {
236270
237271		var  context  = new  AnnotationConfigApplicationContext (configClass );
@@ -289,8 +323,7 @@ protected String getModulePrefix() {
289323		}
290324	}
291325
292- 	@ Test  // GH-3074 
293- 	void  registersGenericsForConstrainingRepositoryFactoryBean () {
326+ 	private  ResolvableType  registerBeanDefinition (Class <?> repositoryFactoryType ) {
294327
295328		AnnotationMetadata  metadata  = AnnotationMetadata .introspect (AnnotatedBeanNamesConfig .class );
296329		AnnotationConfigApplicationContext  context  = new  AnnotationConfigApplicationContext ();
@@ -301,7 +334,7 @@ void registersGenericsForConstrainingRepositoryFactoryBean() {
301334
302335			@ Override 
303336			public  Optional <String > getRepositoryFactoryBeanClassName () {
304- 				return  Optional .of (IdConstrainingRepositoryFactoryBean . class .getName ());
337+ 				return  Optional .of (repositoryFactoryType .getName ());
305338			}
306339		};
307340
@@ -313,11 +346,9 @@ public Optional<String> getRepositoryFactoryBeanClassName() {
313346		assertThat (repositories ).hasSize (1 ).element (0 )
314347				.extracting (BeanComponentDefinition ::getBeanDefinition )
315348				.extracting (BeanDefinition ::getResolvableType )
316- 				.satisfies (it  -> {
317- 					assertThat (it .getGenerics ()).hasSize (2 );
318- 					assertThat (it .getGeneric (0 ).resolve ()).isEqualTo (MyAnnotatedRepository .class );
319- 					assertThat (it .getGeneric (1 ).resolve ()).isEqualTo (Person .class );
320- 				});
349+ 				.isNotNull ();
350+ 
351+ 		return  repositories .get (0 ).getBeanDefinition ().getResolvableType ();
321352	}
322353
323354	static  abstract  class  IdConstrainingRepositoryFactoryBean <T  extends  Repository <S , UUID >, S >
@@ -327,4 +358,20 @@ protected IdConstrainingRepositoryFactoryBean(Class<? extends T> repositoryInter
327358			super (repositoryInterface );
328359		}
329360	}
361+ 
362+ 	static  abstract  class  DomainTypeConstrainingRepositoryFactoryBean <T  extends  Repository <Person , ID >, ID >
363+ 			extends  RepositoryFactoryBeanSupport <T , Person , ID > {
364+ 
365+ 		protected  DomainTypeConstrainingRepositoryFactoryBean (Class <? extends  T > repositoryInterface ) {
366+ 			super (repositoryInterface );
367+ 		}
368+ 	}
369+ 
370+ 	static  abstract  class  AdditionalGenericsRepositoryFactoryBean <T  extends  Repository <S , ID >, S , ID , R >
371+ 			extends  RepositoryFactoryBeanSupport <T , S , ID > {
372+ 
373+ 		protected  AdditionalGenericsRepositoryFactoryBean (Class <? extends  T > repositoryInterface ) {
374+ 			super (repositoryInterface );
375+ 		}
376+ 	}
330377}
0 commit comments