Spring 구성 파일에서 Bean의 속성에 Enum 값을 할당하는 방법은 무엇입니까?


109

다음과 같이 정의 된 독립형 열거 형이 있습니다.

package my.pkg.types;

public enum MyEnumType {
    TYPE1,
    TYPE2
}

이제 해당 유형의 값을 빈 속성에 삽입하고 싶습니다.

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

... 그리고 그것은 작동하지 않았습니다 :(

Enum을 스프링 빈에 어떻게 주입해야합니까?

답변:


129

"TYPE1"을 사용해 보셨습니까? 어쨌든 Spring은 리플렉션을 사용하여 "유형"의 유형을 결정하므로 정규화 된 이름은 중복됩니다. Spring은 일반적으로 중복성을 구독하지 않습니다!


1
정규화 된 이름이 작동하지 않는다는 것이 매우 이상합니다.
Ryan Stull

그러나 "$ {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 : 좋은 지적입니다. 나는 그것을 대답에 추가하는 자유를 취했습니다.
sleske

@Tsering : 값 태그 내에서 Spring EL을 사용할 수 있습니까? $ {abc : ALIEN}
Shubhi224

32

나는 이것이 정말 오래된 질문이라는 것을 알고 있지만 누군가이 새로운 방법을 찾고 있다면 spring util 네임 스페이스를 사용하십시오.

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

스프링 문서에 설명 된대로 .



4

이것은 나를 위해 그것을 한 것입니다 MessageDeliveryMode는 빈이 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 Editors (자세한 내용은 Spring Docs에 있음)를 작성할 수 있습니다.


0

봄 통합 예제, 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.