DATAREST-1590 - Avoid need for eager access to components in RepositoryRestMvcConfiguration.
Switch to ObjectProvider for all component dependencies in the constructor of RepositoryRestMvcConfiguration. Made the bean definition of AnnotatedEventHandlerInvoker a static bean as it's an application listener and it being an instance method causes extend initialization of the configuration class trickling down into unnecessary bean lookups that early in the lifecycle. Fixes GH-1921.
This commit is contained in:
@@ -159,18 +159,17 @@ public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebCon
|
|||||||
@Autowired ApplicationContext applicationContext;
|
@Autowired ApplicationContext applicationContext;
|
||||||
|
|
||||||
@Autowired(required = false) List<BackendIdConverter> idConverters = Collections.emptyList();
|
@Autowired(required = false) List<BackendIdConverter> idConverters = Collections.emptyList();
|
||||||
@Autowired(required = false) List<RepositoryRestConfigurer> configurers = Collections.emptyList();
|
|
||||||
@Autowired(required = false) List<EntityLookup<?>> lookups = Collections.emptyList();
|
@Autowired(required = false) List<EntityLookup<?>> lookups = Collections.emptyList();
|
||||||
|
|
||||||
@Autowired List<HttpMessageConverter<?>> defaultMessageConverters;
|
@Autowired List<HttpMessageConverter<?>> defaultMessageConverters;
|
||||||
|
|
||||||
Optional<LinkRelationProvider> relProvider;
|
ObjectProvider<LinkRelationProvider> relProvider;
|
||||||
Optional<CurieProvider> curieProvider;
|
ObjectProvider<CurieProvider> curieProvider;
|
||||||
Optional<HalConfiguration> halConfiguration;
|
ObjectProvider<HalConfiguration> halConfiguration;
|
||||||
ObjectProvider<ObjectMapper> objectMapper;
|
ObjectProvider<ObjectMapper> objectMapper;
|
||||||
ObjectProvider<RepresentationModelProcessorInvoker> invoker;
|
ObjectProvider<RepresentationModelProcessorInvoker> invoker;
|
||||||
MessageResolver resolver;
|
ObjectProvider<MessageResolver> resolver;
|
||||||
GeoModule geoModule;
|
ObjectProvider<GeoModule> geoModule;
|
||||||
ConversionService defaultConversionService;
|
ConversionService defaultConversionService;
|
||||||
|
|
||||||
private final Lazy<ObjectMapper> mapper;
|
private final Lazy<ObjectMapper> mapper;
|
||||||
@@ -201,13 +200,13 @@ public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebCon
|
|||||||
public RepositoryRestMvcConfiguration( //
|
public RepositoryRestMvcConfiguration( //
|
||||||
ApplicationContext context, //
|
ApplicationContext context, //
|
||||||
@Qualifier("mvcConversionService") ObjectFactory<ConversionService> conversionService, //
|
@Qualifier("mvcConversionService") ObjectFactory<ConversionService> conversionService, //
|
||||||
Optional<LinkRelationProvider> relProvider, //
|
ObjectProvider<LinkRelationProvider> relProvider, //
|
||||||
Optional<CurieProvider> curieProvider, //
|
ObjectProvider<CurieProvider> curieProvider, //
|
||||||
Optional<HalConfiguration> halConfiguration, //
|
ObjectProvider<HalConfiguration> halConfiguration, //
|
||||||
ObjectProvider<ObjectMapper> objectMapper, //
|
ObjectProvider<ObjectMapper> objectMapper, //
|
||||||
ObjectProvider<RepresentationModelProcessorInvoker> invoker, //
|
ObjectProvider<RepresentationModelProcessorInvoker> invoker, //
|
||||||
MessageResolver resolver, //
|
ObjectProvider<MessageResolver> resolver, //
|
||||||
GeoModule geoModule) {
|
ObjectProvider<GeoModule> geoModule) {
|
||||||
|
|
||||||
super(context, conversionService);
|
super(context, conversionService);
|
||||||
|
|
||||||
@@ -390,7 +389,7 @@ public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebCon
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@Bean
|
@Bean
|
||||||
public AnnotatedEventHandlerInvoker annotatedEventHandlerInvoker() {
|
public static AnnotatedEventHandlerInvoker annotatedEventHandlerInvoker() {
|
||||||
return new AnnotatedEventHandlerInvoker();
|
return new AnnotatedEventHandlerInvoker();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -457,13 +456,17 @@ public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebCon
|
|||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
@Bean
|
@Bean
|
||||||
public RepositoryEntityLinks entityLinks(HateoasPageableHandlerMethodArgumentResolver pageableResolver,
|
public RepositoryEntityLinks entityLinks(ObjectFactory<HateoasPageableHandlerMethodArgumentResolver> pageableResolver, //
|
||||||
Repositories repositories, RepositoryResourceMappings resourceMappings,
|
Repositories repositories, //
|
||||||
PluginRegistry<BackendIdConverter, Class<?>> backendIdConverterRegistry,
|
RepositoryResourceMappings resourceMappings, //
|
||||||
RepositoryRestConfiguration repositoryRestConfiguration, HateoasSortHandlerMethodArgumentResolver sortResolver) {
|
PluginRegistry<BackendIdConverter, //
|
||||||
|
Class<?>> backendIdConverterRegistry, //
|
||||||
|
RepositoryRestConfiguration repositoryRestConfiguration, //
|
||||||
|
ObjectFactory<HateoasSortHandlerMethodArgumentResolver> sortResolver) {
|
||||||
|
|
||||||
PagingAndSortingTemplateVariables templateVariables = new ArgumentResolverPagingAndSortingTemplateVariables(
|
Lazy<PagingAndSortingTemplateVariables> templateVariables = Lazy
|
||||||
pageableResolver, sortResolver);
|
.of(() -> new ArgumentResolverPagingAndSortingTemplateVariables(pageableResolver.getObject(),
|
||||||
|
sortResolver.getObject()));
|
||||||
|
|
||||||
return new RepositoryEntityLinks(repositories, resourceMappings, repositoryRestConfiguration, templateVariables,
|
return new RepositoryEntityLinks(repositories, resourceMappings, repositoryRestConfiguration, templateVariables,
|
||||||
backendIdConverterRegistry);
|
backendIdConverterRegistry);
|
||||||
@@ -498,7 +501,8 @@ public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebCon
|
|||||||
Associations associationLinks, @Qualifier RepositoryInvokerFactory repositoryInvokerFactory,
|
Associations associationLinks, @Qualifier RepositoryInvokerFactory repositoryInvokerFactory,
|
||||||
RepositoryRestConfiguration repositoryRestConfiguration) {
|
RepositoryRestConfiguration repositoryRestConfiguration) {
|
||||||
|
|
||||||
return new PersistentEntityToJsonSchemaConverter(persistentEntities, associationLinks, resolver, objectMapper(),
|
return new PersistentEntityToJsonSchemaConverter(persistentEntities, associationLinks, resolver.getObject(),
|
||||||
|
objectMapper(),
|
||||||
repositoryRestConfiguration, new ValueTypeSchemaPropertyCustomizerFactory(repositoryInvokerFactory));
|
repositoryRestConfiguration, new ValueTypeSchemaPropertyCustomizerFactory(repositoryInvokerFactory));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -570,11 +574,11 @@ public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebCon
|
|||||||
|
|
||||||
public ObjectMapper halObjectMapper(LinkCollector linkCollector) {
|
public ObjectMapper halObjectMapper(LinkCollector linkCollector) {
|
||||||
|
|
||||||
LinkRelationProvider defaultedRelProvider = this.relProvider.orElseGet(EvoInflectorLinkRelationProvider::new);
|
LinkRelationProvider defaultedRelProvider = this.relProvider.getIfUnique(EvoInflectorLinkRelationProvider::new);
|
||||||
HalConfiguration halConfiguration = this.halConfiguration.orElseGet(HalConfiguration::new);
|
HalConfiguration halConfiguration = this.halConfiguration.getIfUnique(HalConfiguration::new);
|
||||||
|
|
||||||
HalHandlerInstantiator instantiator = new HalHandlerInstantiator(defaultedRelProvider,
|
HalHandlerInstantiator instantiator = new HalHandlerInstantiator(defaultedRelProvider,
|
||||||
curieProvider.orElse(new DefaultCurieProvider(Collections.emptyMap())), resolver, halConfiguration);
|
curieProvider.getIfUnique(() -> new DefaultCurieProvider(Collections.emptyMap())), resolver.getObject(),
|
||||||
|
halConfiguration);
|
||||||
|
|
||||||
ObjectMapper mapper = basicObjectMapper();
|
ObjectMapper mapper = basicObjectMapper();
|
||||||
mapper.registerModule(persistentEntityJackson2Module(linkCollector));
|
mapper.registerModule(persistentEntityJackson2Module(linkCollector));
|
||||||
@@ -886,7 +890,7 @@ public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebCon
|
|||||||
// Configure custom Modules
|
// Configure custom Modules
|
||||||
configurerDelegate.get().configureJacksonObjectMapper(objectMapper);
|
configurerDelegate.get().configureJacksonObjectMapper(objectMapper);
|
||||||
|
|
||||||
objectMapper.registerModule(geoModule);
|
objectMapper.registerModule(geoModule.getObject());
|
||||||
|
|
||||||
if (repositoryRestConfiguration.get().isEnableEnumTranslation()) {
|
if (repositoryRestConfiguration.get().isEnableEnumTranslation()) {
|
||||||
objectMapper.registerModule(new JacksonSerializers(enumTranslator.get()));
|
objectMapper.registerModule(new JacksonSerializers(enumTranslator.get()));
|
||||||
@@ -927,7 +931,7 @@ public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebCon
|
|||||||
Associations associationLinks, RepositoryRestConfiguration repositoryRestConfiguration) {
|
Associations associationLinks, RepositoryRestConfiguration repositoryRestConfiguration) {
|
||||||
|
|
||||||
return new RootResourceInformationToAlpsDescriptorConverter(associationLinks, repositories, persistentEntities,
|
return new RootResourceInformationToAlpsDescriptorConverter(associationLinks, repositories, persistentEntities,
|
||||||
entityLinks, resolver, repositoryRestConfiguration, objectMapper(), enumTranslator);
|
entityLinks, resolver.getObject(), repositoryRestConfiguration, objectMapper(), enumTranslator);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ import org.springframework.data.rest.core.mapping.SearchResourceMappings;
|
|||||||
import org.springframework.data.rest.webmvc.BaseUri;
|
import org.springframework.data.rest.webmvc.BaseUri;
|
||||||
import org.springframework.data.rest.webmvc.spi.BackendIdConverter;
|
import org.springframework.data.rest.webmvc.spi.BackendIdConverter;
|
||||||
import org.springframework.data.rest.webmvc.spi.BackendIdConverter.DefaultIdConverter;
|
import org.springframework.data.rest.webmvc.spi.BackendIdConverter.DefaultIdConverter;
|
||||||
|
import org.springframework.data.util.Lazy;
|
||||||
import org.springframework.hateoas.Link;
|
import org.springframework.hateoas.Link;
|
||||||
import org.springframework.hateoas.LinkRelation;
|
import org.springframework.hateoas.LinkRelation;
|
||||||
import org.springframework.hateoas.Links;
|
import org.springframework.hateoas.Links;
|
||||||
@@ -62,11 +63,18 @@ public class RepositoryEntityLinks extends AbstractEntityLinks {
|
|||||||
private final Repositories repositories;
|
private final Repositories repositories;
|
||||||
private final ResourceMappings mappings;
|
private final ResourceMappings mappings;
|
||||||
private final RepositoryRestConfiguration config;
|
private final RepositoryRestConfiguration config;
|
||||||
private final PagingAndSortingTemplateVariables templateVariables;
|
private final Lazy<PagingAndSortingTemplateVariables> templateVariables;
|
||||||
private final PluginRegistry<BackendIdConverter, Class<?>> idConverters;
|
private final PluginRegistry<BackendIdConverter, Class<?>> idConverters;
|
||||||
|
|
||||||
public RepositoryEntityLinks(Repositories repositories, ResourceMappings mappings, RepositoryRestConfiguration config,
|
public RepositoryEntityLinks(Repositories repositories, ResourceMappings mappings, RepositoryRestConfiguration config,
|
||||||
PagingAndSortingTemplateVariables templateVariables, PluginRegistry<BackendIdConverter, Class<?>> idConverters) {
|
PagingAndSortingTemplateVariables templateVariables, PluginRegistry<BackendIdConverter, Class<?>> idConverters) {
|
||||||
|
this(repositories, mappings, config, Lazy.of(templateVariables), idConverters);
|
||||||
|
}
|
||||||
|
|
||||||
|
public RepositoryEntityLinks(Repositories repositories, ResourceMappings mappings,
|
||||||
|
RepositoryRestConfiguration config,
|
||||||
|
Lazy<PagingAndSortingTemplateVariables> templateVariables,
|
||||||
|
PluginRegistry<BackendIdConverter, Class<?>> idConverters) {
|
||||||
|
|
||||||
Assert.notNull(repositories, "Repositories must not be null!");
|
Assert.notNull(repositories, "Repositories must not be null!");
|
||||||
Assert.notNull(mappings, "ResourceMappings must not be null!");
|
Assert.notNull(mappings, "ResourceMappings must not be null!");
|
||||||
@@ -297,7 +305,7 @@ public class RepositoryEntityLinks extends AbstractEntityLinks {
|
|||||||
private TemplateVariables getTemplateVariables(UriComponents components, ResourceMapping mapping, Pageable pageable) {
|
private TemplateVariables getTemplateVariables(UriComponents components, ResourceMapping mapping, Pageable pageable) {
|
||||||
|
|
||||||
if (mapping.isPagingResource()) {
|
if (mapping.isPagingResource()) {
|
||||||
return templateVariables.getPaginationTemplateVariables(null, components);
|
return templateVariables.get().getPaginationTemplateVariables(null, components);
|
||||||
} else {
|
} else {
|
||||||
return TemplateVariables.NONE;
|
return TemplateVariables.NONE;
|
||||||
}
|
}
|
||||||
@@ -317,7 +325,7 @@ public class RepositoryEntityLinks extends AbstractEntityLinks {
|
|||||||
Pageable pageable, Sort sort) {
|
Pageable pageable, Sort sort) {
|
||||||
|
|
||||||
if (mapping.isSortableResource()) {
|
if (mapping.isSortableResource()) {
|
||||||
return templateVariables.getSortTemplateVariables(null, components);
|
return templateVariables.get().getSortTemplateVariables(null, components);
|
||||||
} else {
|
} else {
|
||||||
return getTemplateVariables(components, mapping, pageable);
|
return getTemplateVariables(components, mapping, pageable);
|
||||||
}
|
}
|
||||||
@@ -362,7 +370,7 @@ public class RepositoryEntityLinks extends AbstractEntityLinks {
|
|||||||
|
|
||||||
if (mapping.isSortableResource()) {
|
if (mapping.isSortableResource()) {
|
||||||
UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUriString(uri);
|
UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUriString(uri);
|
||||||
templateVariables.enhance(uriBuilder, null, sort);
|
templateVariables.get().enhance(uriBuilder, null, sort);
|
||||||
return uriBuilder.build();
|
return uriBuilder.build();
|
||||||
} else {
|
} else {
|
||||||
return prepareUri(uri, mapping, pageable);
|
return prepareUri(uri, mapping, pageable);
|
||||||
@@ -374,7 +382,7 @@ public class RepositoryEntityLinks extends AbstractEntityLinks {
|
|||||||
UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUriString(uri);
|
UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUriString(uri);
|
||||||
|
|
||||||
if (mapping.isPagingResource()) {
|
if (mapping.isPagingResource()) {
|
||||||
templateVariables.enhance(uriBuilder, null, pageable);
|
templateVariables.get().enhance(uriBuilder, null, pageable);
|
||||||
}
|
}
|
||||||
|
|
||||||
return uriBuilder.build();
|
return uriBuilder.build();
|
||||||
|
|||||||
Reference in New Issue
Block a user