Skip to content

Spring data rest does't work with spring-data-mongodb and spring-cloud-stream #2489

Open
@anasoid

Description

@anasoid

Hello,
I have working on project using spring-data-rest and spring-data-mongodb and all work fine. when i have only add spring-cloud-stream spring-data api doesn't work any more.

Error

I have null pointer in this method (org.springframework.data.rest.webmvc.config.ResourceMetadataHandlerMethodArgumentResolver#resolveArgument) mappings.getMetadataFor(domainType) return null for mongo domaintype.

cause

The bean org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration#persistentEntities does't found MongoMappingContext when calling BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, MappingContext.class).values()), this is because persistentEntities is created when creating MongoMappingContext.

This is the chain of bean creation:

  1. when creating bean MongoMappingContext it publish event
publishEvent:387, AbstractApplicationContext (org.springframework.context.support)
addPersistentEntity:434, AbstractMappingContext (org.springframework.data.mapping.context)
  1. publishing event need all listner to be loaded so bean org.springframework.cloud.stream.function.FunctionConfiguration#streamBridgeUtils should be loaded.

  2. streamBridgeUtils need bean org.springframework.cloud.function.context.config.ContextFunctionCatalogAutoConfiguration#functionCatalog

  3. functionCatalog need all GenericConverter

	@Bean
	public FunctionRegistry functionCatalog(...r) {
		....
		Map<String, GenericConverter> converters = context.getBeansOfType(GenericConverter.class);
  1. bean jsonSchemaConverter org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration#jsonSchemaConverter is loaded because it's a GenericConverter
  2. persistentEntities is loaded because jsonSchemaConverter

so persistentEntities is loaded during MongoMappingContext creation and no way to change order.

version:
Spring-boot 3.4.5 same problem on 3.5.0
spring-cloud-starter-stream-kafka: 4.2.1

persistentEntities:328, RepositoryRestMvcConfiguration (org.springframework.data.rest.webmvc.config)
invoke0:-1, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:77, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:43, DelegatingMethodAccessorImpl (jdk.internal.reflect)
invoke:568, Method (java.lang.reflect)
lambda$instantiate$0:171, SimpleInstantiationStrategy (org.springframework.beans.factory.support)
get:-1, SimpleInstantiationStrategy$$Lambda$714/0x00000008011d2998 (org.springframework.beans.factory.support)
instantiateWithFactoryMethod:88, SimpleInstantiationStrategy (org.springframework.beans.factory.support)
instantiate:168, SimpleInstantiationStrategy (org.springframework.beans.factory.support)
instantiate:653, ConstructorResolver (org.springframework.beans.factory.support)
instantiateUsingFactoryMethod:489, ConstructorResolver (org.springframework.beans.factory.support)
instantiateUsingFactoryMethod:1367, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBeanInstance:1197, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:569, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:529, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:339, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, AbstractBeanFactory$$Lambda$474/0x0000000800f96360 (org.springframework.beans.factory.support)
getSingleton:371, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:337, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:202, AbstractBeanFactory (org.springframework.beans.factory.support)
doResolveDependency:1681, DefaultListableBeanFactory (org.springframework.beans.factory.support)
resolveDependency:1627, DefaultListableBeanFactory (org.springframework.beans.factory.support)
resolveAutowiredArgument:913, ConstructorResolver (org.springframework.beans.factory.support)
createArgumentArray:791, ConstructorResolver (org.springframework.beans.factory.support)
instantiateUsingFactoryMethod:546, ConstructorResolver (org.springframework.beans.factory.support)
instantiateUsingFactoryMethod:1367, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBeanInstance:1197, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:569, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:529, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:339, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, AbstractBeanFactory$$Lambda$474/0x0000000800f96360 (org.springframework.beans.factory.support)
getSingleton:371, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:337, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:202, AbstractBeanFactory (org.springframework.beans.factory.support)
getBeansOfType:747, DefaultListableBeanFactory (org.springframework.beans.factory.support)
getBeansOfType:735, DefaultListableBeanFactory (org.springframework.beans.factory.support)
getBeansOfType:1418, AbstractApplicationContext (org.springframework.context.support)
functionCatalog:113, ContextFunctionCatalogAutoConfiguration (org.springframework.cloud.function.context.config)
invoke0:-1, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:77, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:43, DelegatingMethodAccessorImpl (jdk.internal.reflect)
invoke:568, Method (java.lang.reflect)
lambda$instantiate$0:171, SimpleInstantiationStrategy (org.springframework.beans.factory.support)
get:-1, SimpleInstantiationStrategy$$Lambda$714/0x00000008011d2998 (org.springframework.beans.factory.support)
instantiateWithFactoryMethod:88, SimpleInstantiationStrategy (org.springframework.beans.factory.support)
instantiate:168, SimpleInstantiationStrategy (org.springframework.beans.factory.support)
instantiate:653, ConstructorResolver (org.springframework.beans.factory.support)
instantiateUsingFactoryMethod:645, ConstructorResolver (org.springframework.beans.factory.support)
instantiateUsingFactoryMethod:1367, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBeanInstance:1197, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:569, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:529, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:339, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, AbstractBeanFactory$$Lambda$474/0x0000000800f96360 (org.springframework.beans.factory.support)
getSingleton:371, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:337, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:202, AbstractBeanFactory (org.springframework.beans.factory.support)
doResolveDependency:1681, DefaultListableBeanFactory (org.springframework.beans.factory.support)
resolveDependency:1627, DefaultListableBeanFactory (org.springframework.beans.factory.support)
resolveAutowiredArgument:913, ConstructorResolver (org.springframework.beans.factory.support)
createArgumentArray:791, ConstructorResolver (org.springframework.beans.factory.support)
instantiateUsingFactoryMethod:546, ConstructorResolver (org.springframework.beans.factory.support)
instantiateUsingFactoryMethod:1367, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBeanInstance:1197, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:569, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:529, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:339, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, AbstractBeanFactory$$Lambda$474/0x0000000800f96360 (org.springframework.beans.factory.support)
getSingleton:371, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:337, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:207, AbstractBeanFactory (org.springframework.beans.factory.support)
retrieveApplicationListeners:267, AbstractApplicationEventMulticaster (org.springframework.context.event)
getApplicationListeners:223, AbstractApplicationEventMulticaster (org.springframework.context.event)
multicastEvent:145, SimpleApplicationEventMulticaster (org.springframework.context.event)
publishEvent:454, AbstractApplicationContext (org.springframework.context.support)
publishEvent:387, AbstractApplicationContext (org.springframework.context.support)
addPersistentEntity:434, AbstractMappingContext (org.springframework.data.mapping.context)
lambda$createAndRegisterProperty$3:671, AbstractMappingContext$PersistentPropertyCreator (org.springframework.data.mapping.context)
accept:-1, AbstractMappingContext$PersistentPropertyCreator$$Lambda$1748/0x00000008018f0250 (org.springframework.data.mapping.context)
forEach:75, Iterable (java.lang)
createAndRegisterProperty:668, AbstractMappingContext$PersistentPropertyCreator (org.springframework.data.mapping.context)
doWith:622, AbstractMappingContext$PersistentPropertyCreator (org.springframework.data.mapping.context)
doWithFields:727, ReflectionUtils (org.springframework.util)
doAddPersistentEntity:471, AbstractMappingContext (org.springframework.data.mapping.context)
addPersistentEntity:424, AbstractMappingContext (org.springframework.data.mapping.context)
lambda$createAndRegisterProperty$3:671, AbstractMappingContext$PersistentPropertyCreator (org.springframework.data.mapping.context)
accept:-1, AbstractMappingContext$PersistentPropertyCreator$$Lambda$1748/0x00000008018f0250 (org.springframework.data.mapping.context)
forEach:75, Iterable (java.lang)
createAndRegisterProperty:668, AbstractMappingContext$PersistentPropertyCreator (org.springframework.data.mapping.context)
doWith:622, AbstractMappingContext$PersistentPropertyCreator (org.springframework.data.mapping.context)
doWithFields:727, ReflectionUtils (org.springframework.util)
doAddPersistentEntity:471, AbstractMappingContext (org.springframework.data.mapping.context)
addPersistentEntity:424, AbstractMappingContext (org.springframework.data.mapping.context)
getPersistentEntity:320, AbstractMappingContext (org.springframework.data.mapping.context)
getPersistentEntity:246, AbstractMappingContext (org.springframework.data.mapping.context)
getPersistentEntity:97, AbstractMappingContext (org.springframework.data.mapping.context)
getRequiredPersistentEntity:74, MappingContext (org.springframework.data.mapping.context)
getEntityInformation:160, MongoRepositoryFactory (org.springframework.data.mongodb.repository.support)
getTargetRepository:136, MongoRepositoryFactory (org.springframework.data.mongodb.repository.support)
getRepository:377, RepositoryFactorySupport (org.springframework.data.repository.core.support)
lambda$afterPropertiesSet$4:350, RepositoryFactoryBeanSupport (org.springframework.data.repository.core.support)
get:-1, RepositoryFactoryBeanSupport$$Lambda$1662/0x00000008018d9e70 (org.springframework.data.repository.core.support)
getNullable:135, Lazy (org.springframework.data.util)
get:113, Lazy (org.springframework.data.util)
afterPropertiesSet:356, RepositoryFactoryBeanSupport (org.springframework.data.repository.core.support)
afterPropertiesSet:101, MongoRepositoryFactoryBean (org.springframework.data.mongodb.repository.support)
invokeInitMethods:1865, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
initializeBean:1814, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:607, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:529, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:339, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, AbstractBeanFactory$$Lambda$474/0x0000000800f96360 (org.springframework.beans.factory.support)
getSingleton:371, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:337, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:202, AbstractBeanFactory (org.springframework.beans.factory.support)
resolveCandidate:254, DependencyDescriptor (org.springframework.beans.factory.config)
doResolveDependency:1739, DefaultListableBeanFactory (org.springframework.beans.factory.support)
resolveDependency:1627, DefaultListableBeanFactory (org.springframework.beans.factory.support)
resolveAutowiredArgument:913, ConstructorResolver (org.springframework.beans.factory.support)
createArgumentArray:791, ConstructorResolver (org.springframework.beans.factory.support)
autowireConstructor:240, ConstructorResolver (org.springframework.beans.factory.support)
autowireConstructor:1387, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBeanInstance:1224, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:569, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:529, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:339, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, AbstractBeanFactory$$Lambda$474/0x0000000800f96360 (org.springframework.beans.factory.support)
getSingleton:371, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:337, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:202, AbstractBeanFactory (org.springframework.beans.factory.support)
instantiateSingleton:1221, DefaultListableBeanFactory (org.springframework.beans.factory.support)
preInstantiateSingleton:1187, DefaultListableBeanFactory (org.springframework.beans.factory.support)
preInstantiateSingletons:1122, DefaultListableBeanFactory (org.springframework.beans.factory.support)
finishBeanFactoryInitialization:987, AbstractApplicationContext (org.springframework.context.support)
refresh:627, AbstractApplicationContext (org.springframework.context.support)
refresh:146, ServletWebServerApplicationContext (org.springframework.boot.web.servlet.context)
refresh:753, SpringApplication (org.springframework.boot)
refreshContext:439, SpringApplication (org.springframework.boot)
run:318, SpringApplication (org.springframework.boot)
run:1362, SpringApplication (org.springframework.boot)
run:1351, SpringApplication (org.springframework.boot)

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions