web-dev-qa-db-fra.com

util: carte de printemps ramassant chaque grain du type de carte

J'ai un problème de carte de printemps qui me fait pleurer.

Mon printemps ressemble à ceci:

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

Ensuite, le code où je suis auto-câblé est le suivant (parties non pertinentes omises):

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

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

Étonnamment, cela me donnera en fait une erreur sur l'étape de câblage automatique, indiquant qu'il n'y a pas de beans correspondant au type String. Cependant, si je modifie la carte dans l'unité-test pour qu'elle soit définie en tant que carte, j'obtiens la sortie suivante:

[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

Je n'ai pas encore réussi à faire en sorte que la section clé de l'entrée apparaisse comme une clé. Si je modifie à nouveau la carte en carte et que j'en rajoute dans ma source, la carte se remplit avec celles-ci, en utilisant leurs identifiants comme clés.

Je suis tellement confus ici et ai utilisé le printemps une quantité décente dans le passé. Si quelqu'un a une idée de ce qui se passe ici, je vous en serais très reconnaissant.

Merci d'avance.

J'ai aussi vu cette question: Le câblage automatique d'une liste à l'aide du schéma util donne à NoSuchBeanDefinitionException

Mais la solution consiste à utiliser @Resource, ce que je fais déjà.

19
Craig

Supprimez @Autowired et utilisez uniquement @Resource (name = "mockMap")

25
Ryan

vous ne pouvez pas autoriser une collection comme celle-ci.

Cependant, vous pouvez essayer ces:

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

ou même:

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

Vérifiez la documentation de printemps , la section des conseils:

les beans qui sont eux-mêmes définis comme une collection ou un type de carte ne peuvent pas être injectés via @Autowired, car la correspondance des types ne leur est pas applicable . Utilisez @Resource pour ces haricots

1
Zigri2612

utilisez uniquement @Resource et remplacez "testMap" par "mockMap" dans votre configuration

0
xiaohuo