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