2011-06-24 10 views
18

He definido a con algunos valores "comunes". ¿Cómo puedo extender la lista común por valores adicionales a varios beans nuevos?cómo extender una lista en la configuración de primavera

<util:list id="myCommonList" list-class="java.util.LinkedList"> 
<bean .../> 
<bean .../> 
<bean .../> 
<bean .../> 
</util:list> 


<bean id="extension" parent="myCommonList"> 
    <bean ref="additionalValue"/> 
</bean> 

¿Esto sobrescribirá la lista o la ampliará?

+0

Después de leer muchas soluciones, se me ocurrió la siguiente: http://stackoverflow.com/questions/14520536/spring-collection-merge/14521537#14521537 – BTakacs

+0

Ver también http: // stackoverflow .com/questions/4656460/how-to-extend-already-defined-lists-and-maps-in-spring-application-context – Vadzim

Respuesta

33

Puede hacerlo, pero no utilizando <util:list>, que es solo una sintaxis de conveniencia. El contenedor no proporcionar una función de "colección de fusión", pero usted tiene que utilizar el estilo "viejo":

<bean id="parent" class="org.springframework.beans.factory.config.ListFactoryBean"> 
    <property name="sourceList"> 
     <list> 
      <value>X</value> 
     </list> 
    </property> 
</bean> 

<bean id="child" parent="parent" class="org.springframework.beans.factory.config.ListFactoryBean"> 
    <property name="sourceList"> 
     <list merge="true"> 
      <value>Y</value> 
     </list> 
    </property> 
</bean> 
2

De acuerdo con this JIRA; no hay una solución trivial para esto (actualmente, pero con suerte en 3.1 habrá), aunque hay varias soluciones; p.ej. this uno.

1

Hoy en día yo estaba teniendo este problema también. Para mí, la solución aceptable era usar SpEL y, aunque SpEL no admite varias declaraciones, cree dos clases auxiliares que anexen listas.

Contexto podría implementarse como esto:

<util:list id="list1"> 
    <value>str1</value> 
    <value>str2</value> 
</util:list> 

<util:list id="list2"> 
    <value>str3</value> 
    <value>str4</value> 
</util:list> 

<bean ...> 
    <property name="propertyThatRequiresMergedList" 
     value="#{ new x.y.springs.StringListsMerger().merge(@list1, @list2) }" /> 
</bean> 

y clases:

package x.y.springs; 

import java.util.List; 

public abstract class ListsMerger<T extends List> { 
    public T merge(T ... lists) { 
     T container = createContainer(); 
     for (T list : lists) { 
      container.addAll(list); 
     } 
     return container; 
    } 
    public abstract T createContainer(); 
} 


package x.y.springs; 

import java.util.ArrayList; 
import java.util.List; 

public class StringListsMerger extends ListsMerger<List<String>> { 

    @Override 
    public List<String> createContainer() { 
     return new ArrayList<String>(); 
    } 

} 
+0

Esto es bastante bueno aunque no estoy seguro de por qué no usaste una implementación concreta del genérico Listas de la clase Merger. –

+0

DD. ¿Estás preguntando sobre el uso de algo como '# {new xysprings.ListsMerger () .merge (@ list1, @ list2)}' 'Esto no funcionará si no hay ningún uso de ListMerger en archivos java, de lo contrario no compilará la implementación de ListMerger para String. –

+0

"# {new xysprings.GenericListsMerger(). merge (@ list1, @ list2)}" –

6

Sobre la base de la respuesta de skaffman, puede achive esta manera:

<util:list id="parent"> 
    <value>X</value> 
</util:list> 

<bean id="child" parent="parent" class="org.springframework.beans.factory.config.ListFactoryBean"> 
    <property name="sourceList"> 
     <list merge="true"> 
      <value>Y</value> 
     </list> 
    </property> 
</bean> 
+0

Solo lo probé y no funciona. Solo anulo el utilitario: la lista con los antiguos + nuevos valores funciona, desafortunadamente. En mi caso heredo el utilitario: lista de un proyecto principal, pero esto no debería cambiar nada, supongo. – BAER

0

Puede sobrescribir o agregue cualquier otro bean en esta lista siguiendo el siguiente fragmento.

Por ejemplo: este es su grano que debe ser inyectado en la utilidad AAA: lista mencionada a continuación.

<bean id = "BBB" class=""/> 
<util:list id="AAA"/> 
<bean id="AAAListMergeDirective" depends-on="AAA" 
parent="listMergeDirective" > 
<property name="add" ref="BBB" /> 
</bean> 
Cuestiones relacionadas