我有类似下面的枚举
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属性来将其用作密钥?
我尝试将键类型声明为字符串,希望spring能够解决这个问题,但它似乎忽略了这一点。
使用spring 2.5.1,我无法修改枚举
答案 0 :(得分: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()
声明单独的顶级bean,而使用MIFB允许您使用匿名内部bean。
答案 1 :(得分:3)
以下是如何获得下面注入的值是弹簧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;
}
}