Bean özelliğine Spring yapılandırma dosyasında Enum değeri nasıl atanır?


109

Bağımsız bir enum türü tanımladım, şuna benzer:

package my.pkg.types;

public enum MyEnumType {
    TYPE1,
    TYPE2
}

Şimdi, bu türden bir değeri bir bean özelliğine enjekte etmek istiyorum:

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

... ve bu işe yaramadı :(

Bahar fasulyesine nasıl Enum enjekte etmeliyim?

Yanıtlar:


129

Yalnızca "TİP1" i denediniz mi? Sanırım Spring, "tür" türünü belirlemek için yine de yansıma kullanıyor, bu nedenle tam nitelikli ad gereksizdir. Bahar genellikle fazlalığa katılmaz!


1
Tam nitelikli ismin işe yaramaması oldukça garip.
Ryan Stull

Ama ya "$ {tes.db.database: ORACLE}" gibi bir şey, yani bir özelliği varsayılan olarak kullanmak istersem? Çalışmıyor. Lütfen yardım edin
Shubhi224

39

Value özniteliği yerine değer alt öğesini kullanın ve Enum sınıf adını belirtin:

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

Bu yaklaşımın sadece yazmaya göre avantajı, value="ALIEN"Spring özellikten numaralandırmanın gerçek türünü çıkaramadığında da işe yaramasıdır (örneğin, özelliğin bildirilen türü bir arabirimdir). Araqnid'in yorumundan uyarlanmıştır.


6
Bu, eğer Spring özellikten gerçek numaralandırmanın türünü çıkaramazsa işe yarar (örneğin, özellik sadece bir arayüzdür)
araqnid

@araqnid: İyi nokta. Cevaba ekleme özgürlüğünü aldım.
sleske

@Tsering: Spring EL'i değer etiketi içinde kullanabilir miyim? $ {abc: ALIEN}
Shubhi224

32

Bunun gerçekten eski bir soru olduğunu biliyorum, ancak birisi bunu yapmanın daha yeni bir yolunu arıyorsa, spring util ad alanını kullanın:

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

Yay belgelerinde açıklandığı gibi .



4

Bu benim için yaptığım şeydi MessageDeliveryMode, çekirdeğin PERSISTENT değerine sahip olacağı enumdur:

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

4

SPEL ve P-NAMESPACE'i kullanma:

<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

Spesifik olmak için, değeri enum türündeki bir sabitin adı olacak şekilde ayarlayın, örneğin, sizin durumunuzda "TÜR1" veya "TÜR2" aşağıda gösterildiği gibi. Ve işe yarayacak:

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

0

Daha fazla değer katmak ve özel türlere yazmak istiyorsanız Bean Editörleri yazabilirsiniz (ayrıntılar Bahar Belgelerinde yer almaktadır).


0

Yay entegrasyonu örneği, bir Enum alanına dayalı yönlendirme:

public class BookOrder {

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

yapılandırma:

<router expression="payload.orderType" input-channel="processOrder">
    <mapping value="DELIVERY" channel="delivery"/>
    <mapping value="PICKUP" channel="pickup"/>
</router>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.