spring-projects / spring-projects/spring-hateoas
Spring Hateoas prevents from disabling 'allowBeanDefinitionOverriding'
Nobody has claimed this yet.
- Dominant language
- Java
- Stars
- 1.1k
- Forks
- 476
- PR merge metrics
- No merged PRs in 30d
Description
We had some trouble with overridden spring beans in one of our spring boot applications. So we decided to set spring-context's 'allowBeanDefinitionOverriding' Flag to false
to determine the duplicate bean definitions of our application.
But this leads to an Exception during spring-boot startup, caused by Spring Hateoas (we use spring-hateos to autogenerate the actuator endpoint overview list).
The exception:
org.springframework.beans.factory.BeanDefinitionStoreException:
--
Invalid bean definition with name 'entityLinksPluginRegistry' defined in null:
Cannot register bean definition [Root bean: class [org.springframework.plugin.core.support.PluginRegistryFactoryBean];
scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] for bean 'entityLinksPluginRegistry':
There is already [Root bean: class [org.springframework.plugin.core.support.PluginRegistryFactoryBean];
scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] bound.
at org.springframework.beans.factory.support.DefaultListableBeanFactory.registerBeanDefinition(DefaultListableBeanFactory.java:814)
at org.springframework.hateoas.config.LinkBuilderBeanDefinitionRegistrar.registerBeanDefinitions(LinkBuilderBeanDefinitionRegistrar.java:63)
at org.springframework.hateoas.config.HypermediaSupportBeanDefinitionRegistrar.registerBeanDefinitions(HypermediaSupportBeanDefinitionRegistrar.java:100)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsFromRegistrars(ConfigurationClassBeanDefinitionReader.java:359)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:143)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:116)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:320)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:228)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:270)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:93)
The bean definition 'entityLinksPluginRegistry' is definined in LinkBuilderBeanDefinitionRegistrar, and this Registrar is called twice:
-
From HypermediaAutoConfiguration#EntityLinksConfiguration via @EnableEntityLinks. This Annoation imports the LinkBuilderBeanDefinitionRegistrar.
-
From HypermediaAutoConfiguratoin#HypermediaConfiguration via @EnableHypermediaSupport. This Annoations imports HypermediaSupportBeanDefinitionRegistrar. This registrar in turn creates its own Instance of LinkBuilderBeanDefinitionRegistrar and invokes 'registerBeanDefinitions()'. This second invocation leads to overriding all allready defined Beandefinitions.
Possible Solution:
check in LinkBuilderBeanDefinitionRegistrar if the beans are already defined and avoid duplicate registration.
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with LinkBuilderBeanDefinitionRegistrar and trace its calls from HypermediaAutoConfiguration#EntityLinksConfiguration and #HypermediaConfiguration. Compare the registrations triggered through @EnableEntityLinks and @EnableHypermediaSupport. Done means duplicate bean definitions are avoided and startup succeeds with allowBeanDefinitionOverriding set to false.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java, spring
- Domain
- api, backend
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Clearly specified
- Newbie friendliness
- 38/100