วิธีกำหนดคุณสมบัติของ bean เป็นค่า Enum ในไฟล์ Spring config


109

ฉันมีประเภท enum แบบสแตนด์อโลนที่กำหนดไว้ดังนี้:

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>

... และไม่ได้ผล :(

ฉันจะฉีด Enum ลงในถั่วสปริงได้อย่างไร?

คำตอบ:


129

คุณได้ลอง "TYPE1" แล้วหรือยัง ฉันคิดว่า Spring ใช้การสะท้อนเพื่อกำหนดประเภทของ "ประเภท" อยู่ดีดังนั้นชื่อที่มีคุณสมบัติครบถ้วนจึงซ้ำซ้อน ฤดูใบไม้ผลิโดยทั่วไปไม่สมัครสมาชิกซ้ำซ้อน!


1
ค่อนข้างแปลกที่ชื่อที่มีคุณสมบัติครบถ้วนใช้ไม่ได้
Ryan Stull

แต่ถ้าฉันต้องการใช้บางอย่างเช่น "$ {tes.db.database: ORACLE}" คือการเริ่มต้นคุณสมบัติ มันล้มเหลวในการทำงาน โปรดช่วย
Shubhi224

39

ใช้องค์ประกอบลูกค่าแทนแอตทริบิวต์ค่าและระบุชื่อคลาส Enum:

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

ข้อได้เปรียบของแนวทางนี้มากกว่าการเขียนเพียงอย่างเดียวvalue="ALIEN"คือมันยังใช้ได้ถ้า Spring ไม่สามารถอนุมานประเภทจริงของ enum จากคุณสมบัติได้ (เช่นประเภทที่ประกาศของคุณสมบัติเป็นส่วนต่อประสาน) ดัดแปลงมาจากความคิดเห็นของ araqnid


6
วิธีนี้ใช้ได้ผลหาก Spring ไม่สามารถอนุมานประเภทจริงของ enum จากคุณสมบัติได้ (เช่นคุณสมบัติเป็นเพียงส่วนต่อประสาน)
araqnid

@araqnid: จุดดี ฉันใช้เสรีภาพในการเพิ่มคำตอบ
sleske

@Tsering: ฉันสามารถใช้ Spring EL ภายในแท็กค่าได้หรือไม่? $ {abc: ALIEN}
Shubhi224

32

ฉันรู้ว่านี่เป็นคำถามเก่าจริงๆ แต่ในกรณีที่มีคนกำลังมองหาวิธีที่ใหม่กว่าในการทำสิ่งนี้ให้ใช้เนมสเปซ spring util:

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

ตามที่อธิบายไว้ในเอกสารฤดูใบไม้ผลิ



4

นี่คือสิ่งที่ทำให้ฉัน MessageDeliveryMode คือ enum ที่ bean จะมีค่า PERSISTENT:

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


1

เพื่อให้เฉพาะเจาะจงให้ตั้งค่าเป็นชื่อของค่าคงที่ของประเภท enum เช่น "TYPE1" หรือ "TYPE2" ในกรณีของคุณดังที่แสดงด้านล่าง และจะทำงาน:

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

0

คุณสามารถเขียน Bean Editors (รายละเอียดอยู่ใน Spring Docs) หากต้องการเพิ่มมูลค่าเพิ่มเติมและเขียนลงในประเภทที่กำหนดเอง


0

ตัวอย่างการรวมสปริงการกำหนดเส้นทางตามฟิลด์ 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>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.