【问题标题】:How to assign bean's property an Enum value in Spring config file?如何在 Spring 配置文件中为 bean 的属性分配枚举值?
【发布时间】:2010-10-05 17:32:20
【问题描述】:

我定义了一个独立的枚举类型,如下所示:

package my.pkg.types;

public enum MyEnumType {
    TYPE1,
    TYPE2
}

现在,我想将该类型的值注入到 bean 属性中:

<bean name="someName" class="my.pkg.classes">
   <property name="type" value="my.pkg.types.MyEnumType.TYPE1" />
</bean>

...那没用:(

我应该如何将枚举注入 Spring bean?

【问题讨论】:

    标签: java spring


    【解决方案1】:

    您是否只尝试过“TYPE1”?我想Spring无论如何都使用反射来确定“类型”的类型,因此完全限定名称是多余的。 Spring 一般不订阅冗余!

    【讨论】:

    • 完全限定名称不起作用,这很奇怪。
    • 但是如果我想使用类似 "${tes.db.database:ORACLE}" 的东西怎么办,即默认一个属性。它无法工作。请帮忙
    【解决方案2】:

    具体而言,将值设置为枚举类型的常量的名称,例如,在您的情况下为“TYPE1”或“TYPE2”,如下所示。它会起作用的:

    <bean name="someName" class="my.pkg.classes">
       <property name="type" value="TYPE1" />
    </bean>
    

    【讨论】:

      【解决方案3】:

      使用 value 子元素代替 value 属性并指定 Enum 类名:

      <property name="residence">
          <value type="SocialSecurity$Residence">ALIEN</value>
      </property>
      

      这种方法比只写value="ALIEN" 的优点是,如果 Spring 不能从属性中推断出枚举的实际类型(例如,属性的声明类型是接口),它也可以工作。改编自 araqnid 的评论。

      【讨论】:

      • 如果 Spring 无法从属性推断枚举的实际类型(例如,属性只是一个接口),则此方法有效
      • @araqnid:好点子。我冒昧地将其添加到答案中。
      • @Tsering :我可以在值标签中使用 Spring EL 吗? ${abc:外星人}
      【解决方案4】:

      使用 SPEL 和 P-NAMESPACE:

      <beans...
      xmlns:p="http://www.springframework.org/schema/p" ...>
      ..
      <bean name="someName" class="my.pkg.classes"
          p:type="#{T(my.pkg.types.MyEnumType).TYPE1}"/>
      

      【讨论】:

        【解决方案5】:

        Spring-integration 示例,基于 Enum 字段的路由:

        public class BookOrder {
        
            public enum OrderType { DELIVERY, PICKUP } //enum
            public BookOrder(..., OrderType orderType) //orderType
            ...
        

        配置:

        <router expression="payload.orderType" input-channel="processOrder">
            <mapping value="DELIVERY" channel="delivery"/>
            <mapping value="PICKUP" channel="pickup"/>
        </router>
        

        【讨论】:

          【解决方案6】:

          这就是为我做的 MessageDeliveryMode 是 bean 将具有值 PERSISTENT 的枚举:

          <bean class="org.springframework.amqp.core.MessageDeliveryMode" factory-method="valueOf">
              <constructor-arg value="PERSISTENT" />
          </bean>
          

          【讨论】:

            【解决方案7】:

            我知道这是一个非常老的问题,但如果有人正在寻找更新的方法来做到这一点,请使用 spring util 命名空间:

            <util:constant static-field="my.pkg.types.MyEnumType.TYPE1" />
            

            spring documentation 中所述。

            【讨论】:

              【解决方案8】:

              如果您想添加更多价值并写入自定义类型,您可以编写 Bean 编辑器(详细信息在 Spring 文档中)。

              【讨论】:

                【解决方案9】:

                你可以只做“TYPE1”。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2019-02-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-08-15
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2022-01-09
                  相关资源
                  最近更新 更多