Uploaded image for project: 'Spring Framework'
  1. Spring Framework
  2. SPR-6523

Introduce 'merge' attribute for util namespace collection elements

    Details

    • Type: Improvement
    • Status: Open
    • Priority: Major
    • Resolution: Unresolved
    • Affects Version/s: None
    • Fix Version/s: Pending Closure
    • Component/s: Core
    • Labels:
      None
    • Last commented by a User:
      false

      Description

      Section C.2.2.4 <util:list/> of the reference manual states:

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

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

      <?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>
      
      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;
          }
        }
      }
      

      ... changing the <list> definition in listHolderParent to <util:list> results in the following exception:

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

        Attachments

          Issue Links

            Activity

              People

              • Assignee:
                juergen.hoeller Juergen Hoeller
                Reporter:
                sbrannen Sam Brannen
                Last updater:
                Juergen Hoeller
              • Votes:
                16 Vote for this issue
                Watchers:
                18 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Days since last comment:
                  2 years, 12 weeks, 1 day ago