web-dev-qa-db-fra.com

Le haricot de carte ne peut pas câbler automatiquement

J'ai défini une carte au printemps comme telle:

<util:map id="AdditionalParams" scope="prototype" map-class="Java.util.HashMap" 
          key-type="Java.lang.String" value-type="Java.lang.String">

    <entry key="Start" value="12345" />
    <entry key="Finish" value="12365" />
</util:map>

Et puis je connecte automatiquement ce bean à une propriété définie comme:

private @Autowired @Qualifier(value = "AdditionalParams") Map<String, String> additionalParams;

En faisant cela, une exception est levée en disant que:

Causée par: org.springframework.beans.factory.BeanCreationException: erreur lors de la création du bean avec le nom 'DutyCreator': échec de l'injection des dépendances câblées automatiquement; l'exception imbriquée est org.springframework.beans.factory.BeanCreationException: impossible de câbler automatiquement le champ: private Java.util.Map DutyCreator.additionalParams; Une exception imbriquée est org.springframework.beans.factory.NoSuchBeanDefinitionException: aucun bean correspondant de type [Java.lang.String] n'a été trouvé pour la dépendance [mappage avec le type de valeur Java.lang.String]: au moins 1 bean attendu qui se qualifie en tant que candidat au câblage automatique. pour cette dépendance. Annotations de dépendance: {@ org.springframework.beans.factory.annotation.Autowired (requis = true), @ org.springframework.beans.factory.annotation.Qualifier (value = AdditionalParams)}

Causée par: org.springframework.beans.factory.NoSuchBeanDefinitionException: aucun bean correspondant de type [Java.lang.String] n'a été trouvé pour la dépendance [mappage avec le type de valeur Java.lang.String]: attendu au moins 1 bean qui se qualifie en tant que candidat d'autowire pour cette dépendance. Annotations de dépendance: {@ org.springframework.beans.factory.annotation.Autowired (requis = true), @ org.springframework.beans.factory.annotation.Qualifier (value = AdditionalParams)}

Des idées?

À votre santé.

57
Nick

À partir de Spring 4.3, @Autowiredpeut injecter des listes et des cartes et le code donné dans la question fonctionnerait:

Cela dit, à partir de la version 4.3, les types de collection/carte et de tableau peuvent être mis en correspondance via @Autowired algorithme de correspondance de type également, tant que les informations de type d'élément sont conservées dans @Bean retourne les signatures de type ou les hiérarchies d'héritage de collection.

Mais avec une version Spring inférieure, vous ne pouvez pas câbler automatiquement une collection comme ça. Cependant, vous pouvez effectuer les opérations suivantes:

@Resource(name="AdditionalParams")
private Map<String, String> additionalParams;

ou même:

@Value("#{AdditionalParams}")
private Map<String, String> additionalParams;

Vérifiez le documents de printemps , la section des conseils:

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

117
garst

On dirait que votre @ Qualifier (value = "AdditionalParams") ne fonctionne pas.

Essayez d'utiliser la carte en suivant l'annotation:

@Resource
private Properties AdditionalParams;

et en conservant votre fichier applicationContext.xml intact.

3
Amber
@Autowired ApplicationContext ctx;
private  <T> T getBean(String qualifier, Class<T> returnType){
    //use this for loop to print all bean from ctx. so you wont miss the typo.
    /*for(String s:ctx.getBeanDefinitionNames())
        log.info(s);*/
    return ctx.getBean(qualifier, returnType);
}

// dans votre appel

 if(providerList == null){
       providerList = ctx.getBean("providerList", Map.class);
 }

Cette solution me convient bien

2
Ramkumar Pillai