java.lang.IllegalArgumentException: Cannot merge with object of type [class org.springframework.beans.factory.config.BeanDefinitionHolder]

Spring JIRA | Sam Brannen | 7 years ago
tip
Click on the to mark the solution that helps you, Samebug will learn from it.
As a community member, you’ll be rewarded for you help.
  1. 0

    Section _C.2.2.4 <util:list/>_ of the reference manual states: {quote}Finally, you can also control the merging behavior using the 'merge' attribute of the <util:list/> element; collection merging is described in more detail in the section called "Collection merging".{quote} This is, however, not true. In contrast to the standard support for collections (i.e., array, list, set, map) in the _beans_ namespace, the _util_ namespace does not support the merge attribute for collections. Is this an oversight in the documentation or missing functionality in the util namespace support? On a related note (perhaps worthy of its own JIRA issue), given the following application context configuration and JUnit test class... {code} <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd"> <bean id="listHolderParent" class="com.example.MergedListTests$ListHolder" abstract="true"> <property name="list"> <list> <value>red</value> <value>green</value> <value>blue</value> </list> </property> </bean> <bean id="listHolder" parent="listHolderParent"> <property name="list"> <list merge="true"> <value>cyan</value> <value>magenta</value> <value>yellow</value> <value>black</value> </list> </property> </bean> </beans> {code} {code} package com.example; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import java.util.List; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MergedListTests { @Test public void mergedList() { ApplicationContext appCtx = new ClassPathXmlApplicationContext( "/com/example/MergedListTests-context.xml"); ListHolder listHolder = appCtx.getBean("listHolder", ListHolder.class); assertNotNull(listHolder); assertEquals(7, listHolder.getList().size()); } public static class ListHolder { private List<String> list; public List<String> getList() { return this.list; } public void setList(List<String> list) { this.list = list; } } } {code} ... changing the *<list>* definition in _listHolderParent_ to *<util:list>* results in the following exception: {quote} java.lang.IllegalArgumentException: Cannot merge with object of type [class org.springframework.beans.factory.config.BeanDefinitionHolder] at org.springframework.beans.factory.support.ManagedList.merge(ManagedList.java:98) at org.springframework.beans.factory.support.ManagedList.merge(ManagedList.java:1) at org.springframework.beans.MutablePropertyValues.mergeIfRequired(MutablePropertyValues.java:221) at org.springframework.beans.MutablePropertyValues.addPropertyValue(MutablePropertyValues.java:169) at org.springframework.beans.MutablePropertyValues.addPropertyValues(MutablePropertyValues.java:138) at org.springframework.beans.factory.support.AbstractBeanDefinition.overrideFrom(AbstractBeanDefinition.java:300) at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedBeanDefinition(AbstractBeanFactory.java:1114) at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedBeanDefinition(AbstractBeanFactory.java:1054) at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1040) at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:294) at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:578) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:398) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83) at com.example.MergedListTests.mergedList(MergedListTests.java:17) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ...{quote}

    Spring JIRA | 7 years ago | Sam Brannen
    java.lang.IllegalArgumentException: Cannot merge with object of type [class org.springframework.beans.factory.config.BeanDefinitionHolder]
  2. 0

    Section _C.2.2.4 <util:list/>_ of the reference manual states: {quote}Finally, you can also control the merging behavior using the 'merge' attribute of the <util:list/> element; collection merging is described in more detail in the section called "Collection merging".{quote} This is, however, not true. In contrast to the standard support for collections (i.e., array, list, set, map) in the _beans_ namespace, the _util_ namespace does not support the merge attribute for collections. Is this an oversight in the documentation or missing functionality in the util namespace support? On a related note (perhaps worthy of its own JIRA issue), given the following application context configuration and JUnit test class... {code} <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd"> <bean id="listHolderParent" class="com.example.MergedListTests$ListHolder" abstract="true"> <property name="list"> <list> <value>red</value> <value>green</value> <value>blue</value> </list> </property> </bean> <bean id="listHolder" parent="listHolderParent"> <property name="list"> <list merge="true"> <value>cyan</value> <value>magenta</value> <value>yellow</value> <value>black</value> </list> </property> </bean> </beans> {code} {code} package com.example; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import java.util.List; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MergedListTests { @Test public void mergedList() { ApplicationContext appCtx = new ClassPathXmlApplicationContext( "/com/example/MergedListTests-context.xml"); ListHolder listHolder = appCtx.getBean("listHolder", ListHolder.class); assertNotNull(listHolder); assertEquals(7, listHolder.getList().size()); } public static class ListHolder { private List<String> list; public List<String> getList() { return this.list; } public void setList(List<String> list) { this.list = list; } } } {code} ... changing the *<list>* definition in _listHolderParent_ to *<util:list>* results in the following exception: {quote} java.lang.IllegalArgumentException: Cannot merge with object of type [class org.springframework.beans.factory.config.BeanDefinitionHolder] at org.springframework.beans.factory.support.ManagedList.merge(ManagedList.java:98) at org.springframework.beans.factory.support.ManagedList.merge(ManagedList.java:1) at org.springframework.beans.MutablePropertyValues.mergeIfRequired(MutablePropertyValues.java:221) at org.springframework.beans.MutablePropertyValues.addPropertyValue(MutablePropertyValues.java:169) at org.springframework.beans.MutablePropertyValues.addPropertyValues(MutablePropertyValues.java:138) at org.springframework.beans.factory.support.AbstractBeanDefinition.overrideFrom(AbstractBeanDefinition.java:300) at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedBeanDefinition(AbstractBeanFactory.java:1114) at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedBeanDefinition(AbstractBeanFactory.java:1054) at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1040) at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:294) at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:578) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:398) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83) at com.example.MergedListTests.mergedList(MergedListTests.java:17) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ...{quote}

    Spring JIRA | 7 years ago | Sam Brannen
    java.lang.IllegalArgumentException: Cannot merge with object of type [class org.springframework.beans.factory.config.BeanDefinitionHolder]

    Root Cause Analysis

    1. java.lang.IllegalArgumentException

      Cannot merge with object of type [class org.springframework.beans.factory.config.BeanDefinitionHolder]

      at org.springframework.beans.factory.support.ManagedList.merge()
    2. Spring Beans
      DefaultListableBeanFactory.getBeanNamesForType
      1. org.springframework.beans.factory.support.ManagedList.merge(ManagedList.java:98)
      2. org.springframework.beans.factory.support.ManagedList.merge(ManagedList.java:1)
      3. org.springframework.beans.MutablePropertyValues.mergeIfRequired(MutablePropertyValues.java:221)
      4. org.springframework.beans.MutablePropertyValues.addPropertyValue(MutablePropertyValues.java:169)
      5. org.springframework.beans.MutablePropertyValues.addPropertyValues(MutablePropertyValues.java:138)
      6. org.springframework.beans.factory.support.AbstractBeanDefinition.overrideFrom(AbstractBeanDefinition.java:300)
      7. org.springframework.beans.factory.support.AbstractBeanFactory.getMergedBeanDefinition(AbstractBeanFactory.java:1114)
      8. org.springframework.beans.factory.support.AbstractBeanFactory.getMergedBeanDefinition(AbstractBeanFactory.java:1054)
      9. org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1040)
      10. org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:294)
      10 frames
    3. Spring Context
      ClassPathXmlApplicationContext.<init>
      1. org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:578)
      2. org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:398)
      3. org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
      4. org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
      4 frames
    4. com.example
      MergedListTests.mergedList
      1. com.example.MergedListTests.mergedList(MergedListTests.java:17)
      1 frame
    5. Java RT
      NativeMethodAccessorImpl.invoke0
      1. sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      1 frame