2016-09-14 9 views
-1

app-context.xmlを使用せず、@Bean(name = "customMap")注釈を使用して、春にMap<Integer, CustomEnumType>をどのように注入できるかを考えています。私はSpringで値としてEnumを使用してマップを注入する

@Inject 
Map<Integer, CustomEnumType> customMap; 

を行うことによって、それを注入しようとするとどうやらそれはタイプCustomEnumTypeのいずれかの注射用の依存関係を見つけることができないので、それは文句を言います。しかしCustomEnumTypeは単なる列挙型であり、注入されるはずのものではありません。私はちょうどvalue私のマップのタイプとしてそれを使用したいと思います。

解決策の1つは、フィールドとしてMapを含む注射可能なラッパーオブジェクトを作成することですが、不要な乱雑さを避けたいと思います。 Mapのタイプが注入されているのを見ると、よりきれいで読みやすい。

+0

質問が間違ってフォーマットされましたか?誰かが私が尋ねてきたことを理解していないのですか? – Konstantine

答えて

0

私は解決策を見つけた:

public Canvas(String id, int color) { 
    this.id = id; 
    this.color = Color.getColorByInt(color); 
} 

さて、これを含むXML設定ファイルとしましょう。明らかに@Inject@Autowiredは、使用する必要がある@Beanのタイプを正しく見つけることができません。しかし、@Resource(name = "customMap")を使用すると、すべてが完璧に機能しました。値が列挙型であっても、マップの作成に問題はありませんでした。

@Bean(name = "customMap") 
public Map<Integer, CustomEnumType> getCustomMap() { 
    Map<Integer, CustomEnumType> map = new HashMap<>(); 
    map.put(1, CustomEnumType.type1); 
    map.put(2, CustomEnumType.type2); 
    //... 
    return map; 
} 
CustomEnumType

とは全くコンストラクタが定義されていないとは値が列挙に割り当てられていないことを

@Resource(name = "customMap") 
Map<Integer, CustomEnumType> customMap; 

注を用いて注入:使用される方法でした。私の場合、CustomEnumTypeクラスは私たちが編集できない依存関係であるため、これは初めからやり遂げることもできませんでした。

0

Enumを注入しようとしないで、代わりにint値を注入しようとします。

実際に列挙型はクラスですが、インスタンス/オブジェクトを作成することはできません。そのコンストラクタのアクセス修飾子はprivateのみとなります。なぜなら、そのインスタンスを持つことができないもう一つの証拠です。

Beans of Enumを作成することはできません。Beans of Enumは構築する方法がないため、使用できません。

解決方法は、enumの各メンバーにint値を与え、そのint値を注入することです。例えば

public enum Color { 
    white(0), 
    black(1); 

    private int innerValue; 

    private Color(int innerValue) { 
     this.innerValue = innerValue; 
    } 

    public int getInnerValue() { 
     return innerValue; 
    } 
} 

さて、私は私の列挙型で黒である値1を、注入したいとしましょう。別のクラスをコンストラクタ経由でに転送します。その後、私のコンストラクタは次のようになります。

<bean id="myCanvas" class="com.my.package.Canvas"> 
<constructor-arg name="id" value="9876543" /> 
<constructor-arg name="color" value="1" /> 
<!-- This is the black value for myCanvas bean --> 
</bean> 
関連する問題