spring-projects / spring-projects/spring-hateoas

Spring Hateoas prevents from disabling 'allowBeanDefinitionOverriding'

Open
#640 2 comments 0 reactions 0 assignees View on GitHub

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:

  1. From HypermediaAutoConfiguration#EntityLinksConfiguration via @EnableEntityLinks. This Annoation imports the LinkBuilderBeanDefinitionRegistrar.

  2. 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

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.