Skip to content

Commit 083393f

Browse files
committed
Defer MappingContext lookup in PersistentEntities to allow bean creation while MappingContext is being initialized.
Closes #2489
1 parent a6889a7 commit 083393f

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<>();
@@ -600,8 +588,7 @@ public TypeConstrainedMappingJackson2HttpMessageConverter halJacksonHttpMessageC
600588
* @since 3.5
601589
*/
602590
@Bean
603-
TypeConstrainedMappingJackson2HttpMessageConverter halFormsJacksonHttpMessageConverter(
604-
LinkCollector linkCollector) {
591+
TypeConstrainedMappingJackson2HttpMessageConverter halFormsJacksonHttpMessageConverter(LinkCollector linkCollector) {
605592

606593
LinkRelationProvider defaultedRelProvider = this.relProvider.getIfUnique(EvoInflectorLinkRelationProvider::new);
607594
HalFormsConfiguration configuration = new HalFormsConfiguration(
@@ -612,9 +599,8 @@ TypeConstrainedMappingJackson2HttpMessageConverter halFormsJacksonHttpMessageCon
612599

613600
mapper.registerModule(persistentEntityJackson2Module(linkCollector));
614601
mapper.registerModule(new Jackson2HalFormsModule());
615-
mapper.setHandlerInstantiator(new Jackson2HalModule.HalHandlerInstantiator(
616-
defaultedRelProvider, curieProvider, resolver.getObject(), configuration.getHalConfiguration(),
617-
applicationContext.getAutowireCapableBeanFactory()));
602+
mapper.setHandlerInstantiator(new Jackson2HalModule.HalHandlerInstantiator(defaultedRelProvider, curieProvider,
603+
resolver.getObject(), configuration.getHalConfiguration(), applicationContext.getAutowireCapableBeanFactory()));
618604

619605
return new HalFormsHttpMessageConverter(applicationContext, mapper);
620606
}
@@ -667,9 +653,9 @@ public RequestMappingHandlerAdapter repositoryExporterHandlerAdapter(
667653
initializer.setConversionService(defaultConversionService);
668654
initializer.setValidator(validator.getIfUnique());
669655

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

@@ -739,8 +725,7 @@ protected Module persistentEntityJackson2Module(LinkCollector linkCollector) {
739725

740726
EmbeddedResourcesAssembler assembler = new EmbeddedResourcesAssembler(persistentEntities.get(),
741727
associationLinks.get(), excerptProjector.get());
742-
LookupObjectSerializer lookupObjectSerializer = new LookupObjectSerializer(
743-
PluginRegistry.of(getEntityLookups()));
728+
LookupObjectSerializer lookupObjectSerializer = new LookupObjectSerializer(PluginRegistry.of(getEntityLookups()));
744729

745730
return new PersistentEntityJackson2Module(associationLinks.get(), persistentEntities.get(),
746731
new UriToEntityConverter(persistentEntities.get(), repositoryInvokerFactory.get(),
@@ -753,8 +738,7 @@ protected LinkCollector linkCollector(PersistentEntities persistentEntities, Sel
753738
Associations associationLinks) {
754739

755740
return configurerDelegate.get()
756-
.customizeLinkCollector(
757-
new DefaultLinkCollector(persistentEntities, selfLinkProvider, associationLinks));
741+
.customizeLinkCollector(new DefaultLinkCollector(persistentEntities, selfLinkProvider, associationLinks));
758742
}
759743

760744
@Bean
@@ -771,9 +755,9 @@ public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> excep
771755

772756
ExceptionHandlerExceptionResolver er = new ExceptionHandlerExceptionResolver();
773757
er.setApplicationContext(applicationContext);
774-
er.setCustomArgumentResolvers(defaultMethodArgumentResolvers(selfLinkProvider.get(),
775-
persistentEntityArgumentResolver.get(), persistentEntityResourceAssemblerArgumentResolver.get(),
776-
repoRequestArgumentResolver.get()));
758+
er.setCustomArgumentResolvers(
759+
defaultMethodArgumentResolvers(selfLinkProvider.get(), persistentEntityArgumentResolver.get(),
760+
persistentEntityResourceAssemblerArgumentResolver.get(), repoRequestArgumentResolver.get()));
777761
er.setMessageConverters(defaultMessageConverters.get());
778762

779763
configurerDelegate.get().configureExceptionHandlerExceptionResolver(er);
@@ -948,8 +932,7 @@ PersistentEntityResourceAssemblerArgumentResolver persistentEntityResourceAssemb
948932
projectionFactory.setBeanClassLoader(beanClassLoader);
949933

950934
return new PersistentEntityResourceAssemblerArgumentResolver(persistentEntities.get(), selfLinkProvider.get(),
951-
repositoryRestConfiguration.get().getProjectionConfiguration(), projectionFactory,
952-
associationLinks.get());
935+
repositoryRestConfiguration.get().getProjectionConfiguration(), projectionFactory, associationLinks.get());
953936
}
954937

955938
protected ObjectMapper basicObjectMapper() {
@@ -965,10 +948,8 @@ protected ObjectMapper basicObjectMapper() {
965948
configurerDelegate.get().configureJacksonObjectMapper(objectMapper);
966949

967950
objectMapper.registerModule(geoModule.getObject());
968-
objectMapper.registerModule(new AggregateReferenceResolvingModule(
969-
new UriToEntityConverter(persistentEntities.get(), repositoryInvokerFactory.get(),
970-
() -> defaultConversionService),
971-
resourceMappings.get()));
951+
objectMapper.registerModule(new AggregateReferenceResolvingModule(new UriToEntityConverter(persistentEntities.get(),
952+
repositoryInvokerFactory.get(), () -> defaultConversionService), resourceMappings.get()));
972953

973954
if (repositoryRestConfiguration.get().isEnableEnumTranslation()) {
974955
objectMapper.registerModule(new JacksonSerializers(enumTranslator.get()));
@@ -1040,9 +1021,8 @@ public void addResourceHandlers(ResourceHandlerRegistry registry) {
10401021
@SuppressWarnings("unchecked")
10411022
private static <S> Lazy<List<S>> beansOfType(ApplicationContext context, Class<?> type) {
10421023

1043-
return Lazy.of(() -> (List<S>) context.getBeanProvider(type)
1044-
.orderedStream()
1045-
.collect(StreamUtils.toUnmodifiableList()));
1024+
return Lazy
1025+
.of(() -> (List<S>) context.getBeanProvider(type).orderedStream().collect(StreamUtils.toUnmodifiableList()));
10461026
}
10471027

10481028
private static class ResourceSupportHttpMessageConverter extends TypeConstrainedMappingJackson2HttpMessageConverter

0 commit comments

Comments
 (0)