Spring – Comment définir les clés Enum dans une carte avec des annotations

J’ai un cours Enum

public enum MyEnum{ ABC; } 

que ma classe ‘Mick’ a cette propriété

 private Map myMap; 

J’ai cette configuration de spring au xml

       

et c’est bien.
Je voudrais remplacer cette configuration xml par des annotations Spring.
Avez-vous une idée sur la façon de créer la carte?

Le problème est que si je passe de xml config à l’annotation @Autowired (sur l’atsortingbut myMap de la classe Mick) Spring lance cette exception

 nested exception is org.springframework.beans.FatalBeanException: Key type [class com.MyEnum] of map [java.util.Map] must be assignable to [java.lang.Ssortingng] 

Spring n’est plus en mesure de reconnaître la chaîne ABC en tant qu’object MyEnum.ABC.
Une idée?

Merci

Cela a fonctionné pour moi …

Mon contexte d’application Spring:

     

Ma classe où la Map est injectée:

 public class MyClass { private @Resource Map myMap; } 

Les points importants à noter sont que, dans le contexte Spring, j’ai utilisé SpEL (Spring Expression Language) qui est disponible uniquement depuis la version 3.0. Et dans ma classe, j’ai utilisé @Resource , ni @Inject (ça n’a pas marché pour moi) ni @Autowired (je n’ai pas essayé). La seule différence que je connaisse entre @Resource et @Autowired est que le premier est auto-injecté par nom de bean alors que le dernier le fait par type de bean.

Prendre plaisir!

Celui-ci m’a donné des crises mais j’ai pu le reconstituer en utilisant la réponse de David et quelques autres liens (ci-dessous).

  • ne modifiez pas les noms des propriétés dans la déclaration MapFactoryBean.
  • Assurez-vous que l’atsortingbut de type clé pointe vers l’énumération que vous souhaitez utiliser comme clé dans la carte.

Classe

 @Component public class MyClass { private Map valueMap; @Autowired public void setValueMap(final Map valueMap) { this.valueMap= valueMap; } } 

Enum

  public enum MyEnum{ FOO ("FOO"), BAR ("BAR"), BAZ ("BAZ"); } 

Fichier de configuration XML:

   java.util.HashMap             

LIENS

  • Code Ranch
  • Spring MapFactoryBean exemple sur mkyong.com
  • Comment atsortingbuer à la propriété du bean une valeur Enum dans le fichier de configuration Spring?

Contexte d’application

        FOO     

Classe Java

 package com.project; public class MapProvider { private Map myMap; public void setMyMap(Map myMap) { this.myMap = myMap; } } 

Devrait être:

 public class Mick { private Map myMap; @Autowired public void setMyMap(Map myMap) { this.myMap = myMap; } } 

Regardez http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-annotation-config

Actualisé

Le problème est que, selon le schéma util, vous ne pouvez pas spécifier les types de clé ou de valeur. Vous pouvez cependant implémenter un MapFactoryBean (héritez simplement de org.springframework.beans.factory.config.MapFactoryBean). One ceveat – remarquez que la définition générique (même pensée effacée en runtime) ne vous gêne pas.

L’élément a le type clé, resp. atsortingbuts de type valeur, qui représente la classe des clés, resp. les valeurs. Si vous spécifiez la classe pleinement qualifiée de votre enum dans l’atsortingbut key-type, les clés sont ensuite analysées dans cette énumération lors de la création de la map.

Au cours de l’injection, Spring vérifie que les types de clé et de valeur de la carte, tels qu’ils sont déclarés dans la classe contenant la carte, sont compatibles avec les types de clé et de valeur du bean map. C’est en fait là que vous obtenez l’exception.

Vous devez simplement utiliser une classe de Map concrète comme HashMap et non pas abstraite ou interface:

 public class Mick { private HashMap myMap; @Autowired public void setMyMap(HashMap myMap) { this.myMap = myMap; } } public class AppConfig { @Bean public HashMap myMap() { .. } }