Skip to content

Commit 781d098

Browse files
committed
Defer MappingContext lookup in PersistentEntities to allow bean creation while MappingContext is being initialized.
Closes #2489
1 parent af1840b commit 781d098

File tree

1 file changed

+31
-51
lines changed

1 file changed

+31
-51
lines changed

spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.java

Lines changed: 31 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.Arrays;
2020
import java.util.Collections;
2121
import java.util.HashSet;
22+
import java.util.Iterator;
2223
import java.util.List;
2324
import java.util.Map;
2425
import java.util.Optional;
@@ -274,9 +275,8 @@ public RepositoryRestMvcConfiguration( //
274275

275276
this.configurerDelegate = Lazy.of(() -> {
276277

277-
return new RepositoryRestConfigurerDelegate(context.getBeanProvider(RepositoryRestConfigurer.class)
278-
.orderedStream()
279-
.collect(Collectors.toList()));
278+
return new RepositoryRestConfigurerDelegate(
279+
context.getBeanProvider(RepositoryRestConfigurer.class).orderedStream().collect(Collectors.toList()));
280280
});
281281

282282
this.repositoryRestConfiguration = Lazy.of(() -> context.getBean(RepositoryRestConfiguration.class));
@@ -316,16 +316,11 @@ public RepositoryRelProvider repositoryRelProvider(ObjectFactory<ResourceMapping
316316
}
317317

318318
@Bean
319+
@SuppressWarnings({ "rawtypes", "unchecked" })
319320
public PersistentEntities persistentEntities() {
320321

321-
List<MappingContext<?, ?>> arrayList = new ArrayList<>();
322-
323-
for (MappingContext<?, ?> context : BeanFactoryUtils
324-
.beansOfTypeIncludingAncestors(applicationContext, MappingContext.class).values()) {
325-
arrayList.add(context);
326-
}
327-
328-
return new PersistentEntities(arrayList);
322+
return new PersistentEntities(() -> (Iterator) BeanFactoryUtils
323+
.beansOfTypeIncludingAncestors(applicationContext, MappingContext.class).values().iterator());
329324
}
330325

331326
@Bean
@@ -337,8 +332,7 @@ public DefaultFormattingConversionService defaultConversionService(PersistentEnt
337332
Supplier<ConversionService> supplier = () -> conversionService;
338333

339334
// Add Spring Data Commons formatters
340-
conversionService
341-
.addConverter(new UriToEntityConverter(persistentEntities, repositoryInvokerFactory, supplier));
335+
conversionService.addConverter(new UriToEntityConverter(persistentEntities, repositoryInvokerFactory, supplier));
342336
conversionService.addConverter(new StringToAggregateReferenceConverter(supplier));
343337
conversionService.addConverter(StringToLdapNameConverter.INSTANCE);
344338
addFormatters(conversionService);
@@ -450,8 +444,7 @@ public ResourceMetadataHandlerMethodArgumentResolver resourceMetadataHandlerMeth
450444
@Bean
451445
public BackendIdHandlerMethodArgumentResolver backendIdHandlerMethodArgumentResolver(
452446
PluginRegistry<BackendIdConverter, Class<?>> backendIdConverterRegistry,
453-
ResourceMetadataHandlerMethodArgumentResolver resourceMetadataHandlerMethodArgumentResolver,
454-
BaseUri baseUri) {
447+
ResourceMetadataHandlerMethodArgumentResolver resourceMetadataHandlerMethodArgumentResolver, BaseUri baseUri) {
455448

456449
return new BackendIdHandlerMethodArgumentResolver(backendIdConverterRegistry,
457450
resourceMetadataHandlerMethodArgumentResolver, baseUri);
@@ -469,8 +462,7 @@ public ETagArgumentResolver eTagArgumentResolver() {
469462
* @return
470463
*/
471464
@Bean
472-
public RepositoryEntityLinks entityLinks(
473-
ObjectFactory<HateoasPageableHandlerMethodArgumentResolver> pageableResolver, //
465+
public RepositoryEntityLinks entityLinks(ObjectFactory<HateoasPageableHandlerMethodArgumentResolver> pageableResolver, //
474466
Repositories repositories, //
475467
RepositoryResourceMappings resourceMappings, //
476468
PluginRegistry<BackendIdConverter, //
@@ -494,18 +486,15 @@ public RepositoryEntityLinks entityLinks(
494486
@Bean
495487
public PersistentEntityResourceHandlerMethodArgumentResolver persistentEntityArgumentResolver(
496488
@Qualifier("defaultMessageConverters") List<HttpMessageConverter<?>> defaultMessageConverters,
497-
RootResourceInformationHandlerMethodArgumentResolver repoRequestArgumentResolver,
498-
Associations associationLinks,
499-
BackendIdHandlerMethodArgumentResolver backendIdHandlerMethodArgumentResolver,
500-
PersistentEntities entities) {
489+
RootResourceInformationHandlerMethodArgumentResolver repoRequestArgumentResolver, Associations associationLinks,
490+
BackendIdHandlerMethodArgumentResolver backendIdHandlerMethodArgumentResolver, PersistentEntities entities) {
501491

502492
PluginRegistry<EntityLookup<?>, Class<?>> lookups = PluginRegistry.of(getEntityLookups());
503493
DomainObjectReader reader = new DomainObjectReader(entities, associationLinks);
504494
BindContextFactory factory = new PersistentEntitiesBindContextFactory(entities, defaultConversionService);
505495

506496
return new PersistentEntityResourceHandlerMethodArgumentResolver(defaultMessageConverters,
507-
repoRequestArgumentResolver, backendIdHandlerMethodArgumentResolver,
508-
reader, lookups, factory);
497+
repoRequestArgumentResolver, backendIdHandlerMethodArgumentResolver, reader, lookups, factory);
509498
}
510499

511500
/**
@@ -520,8 +509,8 @@ public PersistentEntityToJsonSchemaConverter jsonSchemaConverter(PersistentEntit
520509
RepositoryRestConfiguration repositoryRestConfiguration) {
521510

522511
return new PersistentEntityToJsonSchemaConverter(persistentEntities, associationLinks, resolver.getObject(),
523-
objectMapper(),
524-
repositoryRestConfiguration, new ValueTypeSchemaPropertyCustomizerFactory(repositoryInvokerFactory));
512+
objectMapper(), repositoryRestConfiguration,
513+
new ValueTypeSchemaPropertyCustomizerFactory(repositoryInvokerFactory));
525514
}
526515

527516
/**
@@ -569,8 +558,7 @@ public TypeConstrainedMappingJackson2HttpMessageConverter jacksonHttpMessageConv
569558
//
570559

571560
@Bean
572-
public TypeConstrainedMappingJackson2HttpMessageConverter halJacksonHttpMessageConverter(
573-
LinkCollector linkCollector,
561+
public TypeConstrainedMappingJackson2HttpMessageConverter halJacksonHttpMessageConverter(LinkCollector linkCollector,
574562
RepositoryRestConfiguration repositoryRestConfiguration) {
575563

576564
ArrayList<MediaType> mediaTypes = new ArrayList<>();
@@ -599,8 +587,7 @@ public TypeConstrainedMappingJackson2HttpMessageConverter halJacksonHttpMessageC
599587
* @since 3.5
600588
*/
601589
@Bean
602-
TypeConstrainedMappingJackson2HttpMessageConverter halFormsJacksonHttpMessageConverter(
603-
LinkCollector linkCollector) {
590+
TypeConstrainedMappingJackson2HttpMessageConverter halFormsJacksonHttpMessageConverter(LinkCollector linkCollector) {
604591

605592
LinkRelationProvider defaultedRelProvider = this.relProvider.getIfUnique(EvoInflectorLinkRelationProvider::new);
606593
HalFormsConfiguration configuration = new HalFormsConfiguration(
@@ -611,9 +598,8 @@ TypeConstrainedMappingJackson2HttpMessageConverter halFormsJacksonHttpMessageCon
611598

612599
mapper.registerModule(persistentEntityJackson2Module(linkCollector));
613600
mapper.registerModule(new Jackson2HalFormsModule());
614-
mapper.setHandlerInstantiator(new Jackson2HalModule.HalHandlerInstantiator(
615-
defaultedRelProvider, curieProvider, resolver.getObject(), configuration.getHalConfiguration(),
616-
applicationContext.getAutowireCapableBeanFactory()));
601+
mapper.setHandlerInstantiator(new Jackson2HalModule.HalHandlerInstantiator(defaultedRelProvider, curieProvider,
602+
resolver.getObject(), configuration.getHalConfiguration(), applicationContext.getAutowireCapableBeanFactory()));
617603

618604
return new HalFormsHttpMessageConverter(applicationContext, mapper);
619605
}
@@ -666,9 +652,9 @@ public RequestMappingHandlerAdapter repositoryExporterHandlerAdapter(
666652
initializer.setConversionService(defaultConversionService);
667653
initializer.setValidator(validator.getIfUnique());
668654

669-
RepositoryRestHandlerAdapter handlerAdapter = new RepositoryRestHandlerAdapter(defaultMethodArgumentResolvers(
670-
selfLinkProvider, persistentEntityArgumentResolver, persistentEntityResourceAssemblerArgumentResolver,
671-
repoRequestArgumentResolver));
655+
RepositoryRestHandlerAdapter handlerAdapter = new RepositoryRestHandlerAdapter(
656+
defaultMethodArgumentResolvers(selfLinkProvider, persistentEntityArgumentResolver,
657+
persistentEntityResourceAssemblerArgumentResolver, repoRequestArgumentResolver));
672658
handlerAdapter.setWebBindingInitializer(initializer);
673659
handlerAdapter.setMessageConverters(defaultMessageConverters);
674660

@@ -738,8 +724,7 @@ protected Module persistentEntityJackson2Module(LinkCollector linkCollector) {
738724

739725
EmbeddedResourcesAssembler assembler = new EmbeddedResourcesAssembler(persistentEntities.get(),
740726
associationLinks.get(), excerptProjector.get());
741-
LookupObjectSerializer lookupObjectSerializer = new LookupObjectSerializer(
742-
PluginRegistry.of(getEntityLookups()));
727+
LookupObjectSerializer lookupObjectSerializer = new LookupObjectSerializer(PluginRegistry.of(getEntityLookups()));
743728

744729
return new PersistentEntityJackson2Module(associationLinks.get(), persistentEntities.get(),
745730
new UriToEntityConverter(persistentEntities.get(), repositoryInvokerFactory.get(),
@@ -752,8 +737,7 @@ protected LinkCollector linkCollector(PersistentEntities persistentEntities, Sel
752737
Associations associationLinks) {
753738

754739
return configurerDelegate.get()
755-
.customizeLinkCollector(
756-
new DefaultLinkCollector(persistentEntities, selfLinkProvider, associationLinks));
740+
.customizeLinkCollector(new DefaultLinkCollector(persistentEntities, selfLinkProvider, associationLinks));
757741
}
758742

759743
@Bean
@@ -770,9 +754,9 @@ public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> excep
770754

771755
ExceptionHandlerExceptionResolver er = new ExceptionHandlerExceptionResolver();
772756
er.setApplicationContext(applicationContext);
773-
er.setCustomArgumentResolvers(defaultMethodArgumentResolvers(selfLinkProvider.get(),
774-
persistentEntityArgumentResolver.get(), persistentEntityResourceAssemblerArgumentResolver.get(),
775-
repoRequestArgumentResolver.get()));
757+
er.setCustomArgumentResolvers(
758+
defaultMethodArgumentResolvers(selfLinkProvider.get(), persistentEntityArgumentResolver.get(),
759+
persistentEntityResourceAssemblerArgumentResolver.get(), repoRequestArgumentResolver.get()));
776760
er.setMessageConverters(defaultMessageConverters.get());
777761

778762
configurerDelegate.get().configureExceptionHandlerExceptionResolver(er);
@@ -946,8 +930,7 @@ PersistentEntityResourceAssemblerArgumentResolver persistentEntityResourceAssemb
946930
projectionFactory.setBeanClassLoader(beanClassLoader);
947931

948932
return new PersistentEntityResourceAssemblerArgumentResolver(persistentEntities.get(), selfLinkProvider.get(),
949-
repositoryRestConfiguration.get().getProjectionConfiguration(), projectionFactory,
950-
associationLinks.get());
933+
repositoryRestConfiguration.get().getProjectionConfiguration(), projectionFactory, associationLinks.get());
951934
}
952935

953936
protected ObjectMapper basicObjectMapper() {
@@ -963,10 +946,8 @@ protected ObjectMapper basicObjectMapper() {
963946
configurerDelegate.get().configureJacksonObjectMapper(objectMapper);
964947

965948
objectMapper.registerModule(geoModule.getObject());
966-
objectMapper.registerModule(new AggregateReferenceResolvingModule(
967-
new UriToEntityConverter(persistentEntities.get(), repositoryInvokerFactory.get(),
968-
() -> defaultConversionService),
969-
resourceMappings.get()));
949+
objectMapper.registerModule(new AggregateReferenceResolvingModule(new UriToEntityConverter(persistentEntities.get(),
950+
repositoryInvokerFactory.get(), () -> defaultConversionService), resourceMappings.get()));
970951

971952
if (repositoryRestConfiguration.get().isEnableEnumTranslation()) {
972953
objectMapper.registerModule(new JacksonSerializers(enumTranslator.get()));
@@ -1038,9 +1019,8 @@ public void addResourceHandlers(ResourceHandlerRegistry registry) {
10381019
@SuppressWarnings("unchecked")
10391020
private static <S> Lazy<List<S>> beansOfType(ApplicationContext context, Class<?> type) {
10401021

1041-
return Lazy.of(() -> (List<S>) context.getBeanProvider(type)
1042-
.orderedStream()
1043-
.collect(StreamUtils.toUnmodifiableList()));
1022+
return Lazy
1023+
.of(() -> (List<S>) context.getBeanProvider(type).orderedStream().collect(StreamUtils.toUnmodifiableList()));
10441024
}
10451025

10461026
private static class ResourceSupportHttpMessageConverter extends TypeConstrainedMappingJackson2HttpMessageConverter

0 commit comments

Comments
 (0)