Skip to content

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

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
anasoid opened this issue May 28, 2025 · 1 comment
Assignees
Labels
status: waiting-for-feedback We need additional information before we can continue status: waiting-for-triage An issue we've not yet triaged

Comments

@anasoid
Copy link

anasoid commented May 28, 2025

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)

@spring-projects-issues spring-projects-issues added the status: waiting-for-triage An issue we've not yet triaged label May 28, 2025
@mp911de
Copy link
Member

mp911de commented Jun 2, 2025

Would you mind attaching a minimal reproducer? Looking at the stack trace, initialization is rooted in MongoRepositoryFactoryBean that is creating a Repository instance. From there on, the wired MappingContext is publishing an event. That being said, MongoMappingContext is fully initialized at that time.

I would like to investigate the said NullPointerException in detail to see what causes it.

@mp911de mp911de added the status: waiting-for-feedback We need additional information before we can continue label Jun 2, 2025
@mp911de mp911de self-assigned this Jun 2, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
status: waiting-for-feedback We need additional information before we can continue status: waiting-for-triage An issue we've not yet triaged
Projects
None yet
Development

No branches or pull requests

3 participants