Bagaimana cara menetapkan properti kacang nilai Enum di file konfigurasi Spring?

109

Saya memiliki jenis enum mandiri yang ditentukan, seperti ini:

package my.pkg.types;

public enum MyEnumType {
    TYPE1,
    TYPE2
}

Sekarang, saya ingin memasukkan nilai jenis itu ke dalam properti kacang:

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

... dan itu tidak berhasil :(

Bagaimana cara menyuntikkan Enum ke dalam kacang pegas?

xelurg
sumber

Jawaban:

129

Sudahkah Anda mencoba "TYPE1"? Saya kira Spring menggunakan refleksi untuk menentukan jenis "tipe", jadi nama yang sepenuhnya memenuhi syarat adalah mubazir. Spring umumnya tidak berlangganan redundansi!

krosenvold.dll
sumber
1
Cukup aneh bahwa nama yang sepenuhnya memenuhi syarat tidak berfungsi.
Ryan Stull
Tapi bagaimana jika saya ingin menggunakan sesuatu seperti "$ {tes.db.database: ORACLE}", yaitu default properti. Gagal bekerja. Tolong bantu
Shubhi224
39

Gunakan elemen anak nilai sebagai ganti atribut nilai dan tentukan nama kelas Enum:

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

Keuntungan dari pendekatan ini dibandingkan hanya menulis value="ALIEN"adalah bahwa ia juga berfungsi jika Spring tidak dapat menyimpulkan tipe sebenarnya dari enum dari properti (misalnya tipe properti yang dideklarasikan adalah antarmuka). Diadaptasi dari komentar araqnid.

Tsering
sumber
6
Ini berfungsi jika Spring tidak dapat menyimpulkan tipe sebenarnya dari enum dari properti (misalnya, properti hanya berupa antarmuka)
araqnid
@araqnid: Poin bagus. Saya mengambil kebebasan untuk menambahkannya ke jawaban.
sleske
@Tsering: Dapatkah saya menggunakan Spring EL dalam tag nilai? $ {abc: ALIEN}
Shubhi224
32

Saya tahu ini adalah pertanyaan yang sangat lama, tetapi jika seseorang mencari cara baru untuk melakukan ini, gunakan namespace util musim semi:

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

Seperti yang dijelaskan dalam dokumentasi pegas .

Lucas
sumber
11

Anda tinggal melakukan "TYPE1".

Jacob Mattison
sumber
4

Inilah yang melakukannya untuk saya MessageDeliveryMode adalah enum kacang akan memiliki nilai PERSISTENT:

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

Menggunakan SPEL dan 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}"/>
Paul Rooney
sumber
1

Untuk lebih spesifik, setel nilai menjadi nama konstanta jenis enum, misalnya, "TYPE1" atau "TYPE2" dalam kasus Anda, seperti yang ditunjukkan di bawah ini. Dan itu akan berhasil:

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

Anda dapat menulis Editor Bean (detailnya ada di Spring Docs) jika Anda ingin menambahkan nilai lebih lanjut dan menulis ke tipe kustom.

Fortyrunner
sumber
0

Contoh integrasi pegas, perutean berdasarkan bidang Enum:

public class BookOrder {

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

config:

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