Spring構成ファイルでBeanのプロパティに列挙値を割り当てる方法は?


109

次のようなスタンドアロンの列挙型が定義されています。

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に注入するにはどうすればよいですか?

回答:


129

「TYPE1」だけ試しましたか?とにかく、Springはリフレクションを使用して「タイプ」のタイプを判別するので、完全修飾名は冗長です。Springは通常、冗長性をサブスクライブしません!


1
完全修飾名が機能しないことはかなり奇妙です。
ライアンスタル

しかし、「$ {tes.db.database:ORACLE}」のようなもの、つまりデフォルトのプロパティを使用したい場合はどうでしょうか。動作しません。助けてください
Shubhi224

39

value属性の代わりにvalue子要素を使用し、Enumクラス名を指定します。

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

このアプローチの単なる書き込みに対する利点はvalue="ALIEN"、Springがプロパティから列挙型の実際のタイプを推測できない場合にも機能することです(たとえば、プロパティの宣言されたタイプはインターフェイスです)。araqnidのコメントからの引用。


6
これは、Springがプロパティから列挙型の実際のタイプを推測できない場合に機能します(たとえば、プロパティは単なるインターフェースです)
araqnid

@araqnid:いいですね。私は自由に答えにそれを追加しました。
sleske 2015

@Tsering:値タグ内でSpring ELを使用できますか?$ {abc:ALIEN}
Shubhi224 2018

32

これは本当に古い質問ですが、誰かがこれを行うための新しい方法を探している場合は、spring util名前空間を使用します。

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

春のドキュメントに記載されています



4

MessageDeliveryModeは、Beanの値がPERSISTENTになる列挙型です。

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

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}"/>

1

具体的には、次に示すように、値を列挙型の定数の名前に設定します。たとえば、「TYPE1」や「TYPE2」のようにします。そしてそれはうまくいきます:

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

0

さらに値を追加してカスタム型に書き込みたい場合は、Beanエディターを作成できます(詳細はSpring Docsにあります)。


0

Spring統合の例、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>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.