Làm cách nào để gán thuộc tính của bean một giá trị Enum trong tệp cấu hình Spring?


109

Tôi có một kiểu enum độc lập được xác định, giống như sau:

package my.pkg.types;

public enum MyEnumType {
    TYPE1,
    TYPE2
}

Bây giờ, tôi muốn đưa một giá trị của kiểu đó vào thuộc tính bean:

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

... và điều đó không hoạt động :(

Tôi nên tiêm Enum vào đậu xuân như thế nào?

Câu trả lời:


129

Bạn đã thử chỉ "TYPE1" chưa? Tôi cho rằng Spring sử dụng phản chiếu để xác định loại "type", vì vậy tên đầy đủ đủ điều kiện là dư thừa. Mùa xuân nói chung không đăng ký dự phòng!


1
Khá lạ là tên đủ điều kiện không hoạt động.
Ryan Stull

Nhưng điều gì sẽ xảy ra nếu tôi muốn sử dụng một cái gì đó như "$ {tes.db.database: ORACLE}", tức là mặc định một thuộc tính. Nó không hoạt động. Hãy giúp đỡ
Shubhi224

39

Sử dụng phần tử con giá trị thay vì thuộc tính giá trị và chỉ định tên lớp Enum:

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

Ưu điểm của cách tiếp cận này so với việc chỉ viết value="ALIEN"là nó cũng hoạt động nếu Spring không thể suy ra kiểu thực tế của enum từ thuộc tính (ví dụ: kiểu khai báo của thuộc tính là một giao diện). Phỏng theo bình luận của araqnid.


6
Công trình này nếu mùa xuân không thể suy ra các loại thực tế của enum từ tài sản (ví dụ như bất động sản chỉ là một giao diện)
araqnid

@araqnid: Điểm tốt. Tôi đã tự do thêm nó vào câu trả lời.
sleske

@Tsering: Tôi có thể sử dụng Spring EL trong thẻ value không? $ {abc: ALIEN}
Shubhi224

32

Tôi biết đây là một câu hỏi thực sự cũ, nhưng trong trường hợp ai đó đang tìm kiếm cách mới hơn để thực hiện việc này, hãy sử dụng không gian tên spring use:

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

Như được mô tả trong tài liệu mùa xuân .



4

Đây là những gì đã làm cho tôi MessageDeliveryMode là enum bean sẽ có giá trị PERSISTENT:

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

4

Sử dụng SPEL và 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

Để cụ thể, hãy đặt giá trị là tên của một hằng số của kiểu enum, ví dụ: "TYPE1" hoặc "TYPE2" trong trường hợp của bạn, như được hiển thị bên dưới. Và nó sẽ hoạt động:

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

0

Bạn có thể viết Bean Editors (chi tiết có trong Spring Docs) nếu bạn muốn thêm giá trị hơn nữa và ghi vào các loại tùy chỉnh.


0

Ví dụ về tích hợp mùa xuân, định tuyến dựa trên trường Enum:

public class BookOrder {

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

cấu hình:

<router expression="payload.orderType" input-channel="processOrder">
    <mapping value="DELIVERY" channel="delivery"/>
    <mapping value="PICKUP" channel="pickup"/>
</router>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.