【问题标题】:Inserting enum value in a map using spring使用弹簧在地图中插入枚举值
【发布时间】:2012-01-25 04:01:50
【问题描述】:

我正在将项目中的一些配置迁移到 Spring bean。我完全陷入了必须创建地图的地步,并且该地图的值应该是枚举的方法。

需要移动到 Spring 的 java 代码看起来像

map.put(key, Direction.Up.getIntVal())

我找到了一个很好的链接 here(http://www.unicon.net/node/601),它允许我指定一个引用某个类的静态字段的键或值,例如

<util:constant static-field="javax.naming.Context.INITIAL_CONTEXT_FACTORY"/>

但找不到任何符合我要求的资源。有没有办法使用 Spring 实现我想要做的事情?

【问题讨论】:

    标签: java spring


    【解决方案1】:

    你试过FieldRetrievingFactoryBean吗?你可以阅读它here。鉴于您正在尝试编写地图,我认为配置看起来像:

    <bean id="enum" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">
        <property name="targetClass" value="package.name.Direction"/>
        <property name="targetField" value="Up"/>
    </bean>
    <bean id="Direction.Up" factory-bean="enum" factory-method="getIntVal"/>
    
    <util:map id="emails">
        <entry key="key" value-ref="Direction.Up"/>
    </util:map>
    

    我今天早上花了一些时间来验证配置,这将满足您的需求。可能有一种方法可以缩写枚举 bean 定义,但我不确定。

    【讨论】:

    • 当 Direction 是 Enum 并且 intVal 是私有成员时,你认为这会起作用吗
    • 从您最初的问题来看,您在枚举上有一个公共方法 getIntVal()。通过将值设置为package.name.Direction.Up.intVal,Spring 发挥了很多作用,实际上调用了 Direction.Up.getIntVal()。然后该值将存储在 bean Direction.Up 中。就像我说的那样,我自己从未真正尝试过,只是继续我在文档中阅读的内容。
    • @Anish 我已经将上面的配置更新为我今天早上测试和工作的东西。希望这会有所帮助。
    【解决方案2】:

    如果你想在一个类中注入一个枚举,只需使用枚举值,而不是完全分类的名称。由于您希望枚举的值在 map 中,

    <bean id="enumBean" 
        class="com.enumClass" factory-method="valueOf">
          <constructor-arg>
              <value>enumVal</value>
          </constructor-arg>
    </bean>
    
    <util:map id="enumMap">
        <entry key="key" ref="enumBean.intVal"/>
    </util:map>
    

    我从here 那里得到了一点帮助。检查这是否对您有帮助。

    【讨论】:

    • 如果我没记错的话,这里的枚举是在 Spring XML 本身内部定义的。就我而言,枚举是 Java 语言,我必须引用该枚举的方法。
    • @Ashish ,我在想如果我们需要访问枚举的属性,我们需要将它作为一个 bean。你试过 吗?
    • 将枚举转换为 bean 将是我的最后手段,因为我的应用程序中有很多这样的枚举,如果我没有任何其他解决方法,我将不得不将它们全部移动到 bean。我没有尝试过静态字段,主要是因为该标签用于类的公共静态属性。这里我有一个枚举的私有属性,只能通过公共方法访问。
    • @Anish - 有没有一种方法可以创建自己的工厂类,根据名称提供适当的 bean/值?可能是一种解决方法,它允许您将 Enum 值作为 bean 获取,而实际上不必将每个 enum 定义为独立的 bean。只是一个想法。
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 2018-11-03
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多