【问题标题】:Inject the value of an enum into a property using spring使用 spring 将枚举的值注入到属性中
【发布时间】:2012-12-28 16:09:04
【问题描述】:

我有一个类似于下面的枚举

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 我无法修改枚举

【问题讨论】:

    标签: java spring


    【解决方案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" />
    

    但这意味着为每个枚举常量以及它们的 value() 声明单独的顶级 bean,而使用 MIFB 允许您使用匿名内部 bean。

    【讨论】:

      【解决方案2】:

      这里是如何获取注入的值,下面是spring 2.5中的spring配置。

      <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;
      }
      }
      

      【讨论】:

      • 我认为spring 2.5.1不支持SpEL,我也无法修改枚举类添加getValue()。
      • @ManuelQuinones OP 说他们“不能修改枚举”
      • 我会尝试@IanRoberts 的建议。在我看来,它是春季 2.5 的干净解决方案
      猜你喜欢
      • 1970-01-01
      • 2014-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多