簡體   English   中英

使用spring將枚舉的值注入屬性

[英]Inject the value of an enum into a property using spring

我有一個類似於下面的枚舉

public enum MyEnum {
ABC("some string"), 
DEF("some string"), 
GHI("another string");

String value;

private MyEnum(String value) {
    this.value = value;
}

public String value() {
    return this.value;
}}

我想創建一個util:map,使用枚舉的值作為鍵而不是枚舉本身。 所以地圖看起來像這樣:

"some string" -> "mapped output 1"
"another string" -> "mapped output 2"

我知道我可以使用util:constant來獲取枚舉,但我需要enum所代表的值。

所以我的配置文件在這一刻看起來像這樣:

<util:constant id="firstKey" static-field="package.MyEnum.ABC"/>
<util:constant id="secondKey" static-field="package.MyEnum.GHI" />


<util:map id="myMap">
    <entry key-ref="firstKey" value="mapped output 1" />
    <entry key-ref="secondKey" value="mapped output 2" /></util:map>

有沒有辦法可以獲得.value()甚至可以訪問value屬性來使用它作為鍵?

我試圖將鍵類型聲明為字符串,希望spring能夠解決這個問題,但它似乎忽略了這一點。

使用spring 2.5.1,我無法修改枚舉

如果您無法訪問表達式語言,則必須回退到顯式的MethodInvokingFactoryBean

<bean id="firstKey" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
  <property name="targetObject"><util:constant static-field="package.MyEnum.ABC"/></property>
  <property name="targetMethod" value="value" />
</bean>

您可以使用抽象父bean定義縮短重復XML。

<bean name="enumValue" abstract="true"
      class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
  <property name="targetMethod" value="value" />
</bean>

<bean id="firstKey" parent="enumValue">
  <property name="targetObject"><util:constant static-field="package.MyEnum.ABC"/></property>
</bean>

您也可以跳過MethodInvokingFactoryBean並使用

<util:constant id="MyEnum_ABC" static-field="package.MyEnum.ABC" />
<bean id="firstKey" factory-bean="MyEnum_ABC" factory-method="value" />

但這意味着為每個枚舉常量聲明單獨的頂級bean以及它們的value() ,而使用MIFB允許您使用匿名內部bean。

以下是如何獲得下面注入的值是彈簧2.5中的彈簧配置。

<bean id="abcEnum" class="com.ex.springbasicex.enums.MyEnum"   factory-method="valueOf">
    <constructor-arg>
        <value>ABC</value>
    </constructor-arg>
</bean>

<bean id="defEnum" class="com.ex.springbasicex.enums.MyEnum" factory-method="valueOf">
    <constructor-arg>
        <value>DEF</value>
    </constructor-arg>
</bean>

<bean id="abcString" class="java.lang.String" factory-method="valueOf">
    <constructor-arg>
        <ref bean="abcEnum"></ref>
    </constructor-arg>
</bean>
<bean id="defString" class="java.lang.String" factory-method="valueOf">
    <constructor-arg>
        <ref bean="defEnum"></ref>
    </constructor-arg>
</bean>

<util:map id="myMap" map-class="java.util.HashMap" key-type="java.lang.String" value-type="java.lang.String">
    <entry key-ref="abcString" value="mapped output 1"  />
    <entry key-ref="defString" value="mapped output 2" />
</util:map>

為了使其工作,您需要在枚舉上使用toString方法。

public enum MyEnum {

ABC("some string a"), 
DEF("some string b"), 
GHI("another string");

String value;

private MyEnum(String value) {
    this.value = value;
}

public String value() {
    return this.value;
}

public String toString() {
    return this.value;
}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM