2012-09-07 10 views
17

Tengo un problema con el mapa de Spring que me hace llorar.util: mapa en Spring recogiendo cada bean del tipo de mapa

Mi primavera se ve así:

<?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: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 
    "> 

    <util:map id="mockMap"> 
     <entry key="userTest1" value="test1"/> 
     <entry key="userTest2" value="test2"/> 
     <entry key="userTest3" value="test6"/> 
    </util:map> 
</beans> 

continuación, el código donde estoy Autowiring esto es la siguiente (partes irrelevantes omitidos):

@Autowired 
@Resource(name="mockMap") 
Map<String, String> testMap; 

@Test 
public void testGetGearListActivityOK() { 
    for (String key : testMap.keySet()) { 
     System.out.println("key = " + key); 
    } 
} 

Sorprendentemente, esto va a darme una error en el paso de autoencendido que indica que no hay ningún tipo de combinación de frijoles String. Sin embargo, si cambio el mapa en la unidad de prueba que se define como Mapa entonces consigo la salida de la siguiente manera:

[junit] key = mockMap 
[junit] key = org.springframework.context.annotation.internalConfigurationAnnotationProcessor 
[junit] key = org.springframework.context.annotation.internalAutowiredAnnotationProcessor 
[junit] key = org.springframework.context.annotation.internalRequiredAnnotationProcessor 
[junit] key = org.springframework.context.annotation.internalCommonAnnotationProcessor 
[junit] key = systemProperties 
[junit] key = systemEnvironment 
[junit] key = messageSource 
[junit] key = applicationEventMulticaster 
[junit] key = lifecycleProcessor 

todavía no he sido capaz de obtener la sección clave de la entrada a en realidad aparece como una clave. Si cambio el mapa de nuevo a Map y agrego algo en mi spring, el mapa se llena con esos, usando sus id como claves.

Estoy tan confundido aquí y he usado la primavera una cantidad decente en el pasado. Si alguien tiene una idea de lo que está pasando aquí, estaría muy agradecido.

Gracias de antemano.

Además, vi esta pregunta: Auto-wiring a List using util schema gives NoSuchBeanDefinitionException

Pero la solución no es utilizar @Resource, que yo ya estoy haciendo ..

Respuesta

23

Retire @Autowired y sólo utilizar el @Resource (name =" mockMap ")

+3

El Autowired está anulando el recurso y por lo tanto Spring está buscando el primer objeto Map que tiene, que pasa a ser el contexto de primavera. Es por eso que obtienes la clave que mencionaste como salida. – dennisjtaylor

+1

En realidad, lo que sucede es que si usa @Autowired en cualquier colección, buscará cualquier bean que coincida con su calificador (o todos los beans de ese tipo si no tiene un calificador) y los agregará a la colección. Si no tiene ningún tipo de frijoles de ese tipo, obtendrá una excepción de "no se encontró ningún frijol, al menos uno esperado" durante el autoenvío de ese objeto. – Craig

+0

hoy pasé 3 horas en esto :( – Nayn

0

sólo utilizan @Resource y el cambio "testMap" a "mockMap" en la configuración del

0

no se puede Autowire una colección así.

Sin embargo, puede probar estos:

@Resource(name="mockMap") 
private Map<String, String> testMap; 

o incluso:

@Value("#{mockMap}") 
private Map<String, String> testMap; 

Comprobar la spring docs, la sección de consejos:

frijoles que ellos mismos se definen como una colección o el tipo de mapa no puede ser inyectado a través de @Autowired, porque la coincidencia de tipos no es correcta aplicable a ellos. Use @Resource para tales beans

Cuestiones relacionadas