2012-09-07 6 views
17

Ho un problema con la mappa di primavera che mi sta facendo piangere.util: mappa in primavera che preleva ogni bean del tipo di mappa

la mia primavera si presenta così:

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

Quindi il codice dove sono autowiring questo è la seguente (parti irrilevanti omessi):

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

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

Abbastanza sorprendentemente, questo sarà effettivamente darmi una errore nella fase di autowiring che dice che non ci sono bean che corrispondono al tipo String. Tuttavia, se cambio la mappa nell'unità-test per essere definito come Mappa allora ottengo l'uscita segue:

[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 

io non sono ancora stati in grado di ottenere la sezione chiave della voce di in realtà si presentano come una chiave. Se cambio di nuovo la mappa in Mappa e ne aggiungo alcuni nella mia molla, la mappa si riempie con quelli, usando i loro id come chiavi.

Sono così confuso qui e ho usato la primavera in quantità decente in passato. Se qualcuno ha idea di cosa diavolo sta succedendo qui sarei molto grato.

Grazie in anticipo.

Inoltre, ho visto questa domanda: Auto-wiring a List using util schema gives NoSuchBeanDefinitionException

Ma la soluzione non è quella di utilizzare @Resource, che sto già facendo ..

risposta

23

Rimuovere @Autowired e solo usare il @Resource (name =" mockMap ")

+3

L'Autowired sta eseguendo l'override della Risorsa e quindi Spring sta cercando il primo oggetto Mappa che ha il contesto di primavera. Questo è il motivo per cui ottieni la chiave che hai menzionato come output. – dennisjtaylor

+1

In realtà ciò che accade è che se si usa @Autowired su una qualsiasi raccolta, cercherà qualsiasi bean che corrisponda al qualificatore (o tutti i bean di quel tipo se non si dispone di un qualificatore) e li aggiungerà alla raccolta. Se non si dispone di alcun bean di quel tipo, si otterrà un'eccezione "nessun bean trovato, almeno uno previsto" durante l'autowiring di quell'oggetto. – Craig

+0

oggi ho passato 3 ore su questo :( – Nayn

0

utilizzare solo @Resource e cambiamento "testMap" a "mockMap" nella configurazione

0

non si può autowire una collezione del genere.

Tuttavia, si può provare questi:

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

o anche:

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

Controllare il spring docs, la sezione di punte:

fagioli che sono essi stessi definito come una raccolta o il tipo di mappa non può essere immesso tramite @Autowired, perché la corrispondenza del tipo non è corretta applicabili a loro. Utilizza @Resource per tali bean