5

私は以下のような列挙型を持っています

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を使用して列挙型を取得できることはわかっていますが、列挙型が表す値が必要です。

したがって、その時点での私の設定ファイルは次のようになります。

<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プロパティにアクセスしてそれをキーとして使用したりする方法はありますか?

春がうまくいくことを期待して、キータイプを文字列として宣言しようとしましたが、これを無視したようです。

スプリング2.5.1を使用していて、列挙型を変更できません

4

2 に答える 2

7

式言語にアクセスできない場合は、明示的にフォールバックする必要があります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" />

ただし、これは、各列挙型定数とそのvalue().

于 2012-12-28T17:02:51.657 に答える
3

以下に注入された値を取得する方法は、Spring 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;
}
}
于 2012-12-28T16:36:35.537 に答える