복붙노트

[SPRING] 주석이있는 Map에서 Enum 키를 설정하는 방법

SPRING

주석이있는 Map에서 Enum 키를 설정하는 방법

Enum 클래스가 있습니다.

public enum MyEnum{
    ABC;
}

내 '믹'클래스보다이 속성이 있습니다.

private Map<MyEnum, OtherObj> myMap;

저는이 봄 xml 구성을했습니다.

<util:map id="myMap">
    <entry key="ABC" value-ref="myObj" />
</util:map>

<bean id="mick" class="com.x.Mick">
    <property name="myMap" ref="myMap" />
</bean>

그리고 이것은 괜찮습니다. 이 xml 구성을 Spring 주석으로 바꾸고 싶습니다. 지도를 자동 줄 바꿈하는 방법에 대해 알고 있습니까?

여기에 문제는 내가 xml 구성에서 @Autowired 주석 (Mick 클래스의 myMap 특성에)으로 전환하면 Spring이이 예외를 던지고 있다는 것입니다

nested exception is org.springframework.beans.FatalBeanException: Key type [class com.MyEnum] of map [java.util.Map] must be assignable to [java.lang.String]

Spring은 문자열 ABC를 MyEnum.ABC 객체로 인식 할 수 없습니다. 어떤 생각?

감사

해결법

  1. ==============================

    1.이것은 나를 위해 일했다. ..

    이것은 나를 위해 일했다. ..

    My Spring 애플리케이션 컨텍스트 :

    <util:map id="myMap">
      <entry key="#{T(com.acme.MyEnum).ELEM1}" value="value1" />
      <entry key="#{T(com.acme.MyEnum).ELEM2}" value="value2" />
    </util:map>
    

    지도가 주입되는 내 수업 :

    public class MyClass {
    
        private @Resource Map<MyEnum, String> myMap;
    }
    

    주의해야 할 중요한 점은 스프링 컨텍스트에서 버전 3.0 이후에만 사용 가능한 SpEL (Spring Expression Language)을 사용한다는 것입니다. 그리고 수업 시간에 @Resource를 사용했는데 @Inject (나에게 효과가 없었 음) 나 @Autowired (나는 이것을 시도하지 않았습니다.)도 사용하지 않았습니다. @Resource와 @Autowired 사이의 유일한 차이점은 이전의 bean 이름에 의한 자동 삽입과 bean 유형에 의한 자동 삽입이 있다는 것입니다.

    즐겨!

  2. ==============================

    2.이 하나는 나에게 적합을 줬다. 그러나 나는 David의 대답과 다른 링크 (아래)를 사용하여 그것을 함께 짤 수 있었다.

    이 하나는 나에게 적합을 줬다. 그러나 나는 David의 대답과 다른 링크 (아래)를 사용하여 그것을 함께 짤 수 있었다.

    수업

    @Component
    public class MyClass {
    
        private Map<MyEnum, ValueObjectInterface> valueMap;
    
        @Autowired
        public void setValueMap(final Map<MyEnum, ValueObjectInterface> valueMap) {
            this.valueMap= valueMap;
        }
    
    
    }
    

    열거 형

        public enum MyEnum{
        FOO ("FOO"),
        BAR ("BAR"),
        BAZ ("BAZ");
    }
    

    XML 구성 파일 :

    <bean id="valueMap" class="org.springframework.beans.factory.config.MapFactoryBean">
        <property name="targetMapClass">
            <value>java.util.HashMap</value>
        </property>
        <property name="sourceMap">
            <map key-type="com.company.packagepath.MyEnum">
              <entry key="FOO" value-ref="valueObject1" />
              <entry key="BAR" value-ref="valueObject2" />
              <entry key="BAZ" value-ref="valueObject3" />
            </map>
        </property>
    </bean>
    
    <bean id="valueObject1"  class="com.company.packagepath.ValueObject1" />
    <bean id="valueObject2"  class="com.company.packagepath.ValueObject2" />
    <bean id="valueObject3"  class="com.company.packagepath.ValueObject3" />
    

    모래밭

  3. ==============================

    3.응용 프로그램 컨텍스트

    응용 프로그램 컨텍스트

    <?xml version="1.0" encoding="UTF-8"?>
    
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:util="http://www.springframework.org/schema/util"
           xsi:schemaLocation="http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd ">
    
    <bean id="myProvider" class="com.project.MapProvider">
        <property name="myMap" ref="myMap"/>
    </bean>
    
    <util:map id="myMap" key-type="com.project.MyEnum" value-type="com.project.ValueObject">
        <entry>
            <key><value type="com.project.MyEnum">FOO</value></key>
            <ref bean="objectValue1"/>
        </entry>
    </util:map>
    </beans>
    

    Java 클래스

    package com.project;
    
    public class MapProvider {
    
        private Map<MyEnum, ValueObject> myMap;
    
        public void setMyMap(Map<MyEnum, ValueObject> myMap) {
            this.myMap = myMap;
        }
    }
    
  4. ==============================

    4.해야한다:

    해야한다:

    public class Mick {
    
      private Map<MyEnum, OtherObj> myMap;
    
      @Autowired
      public void setMyMap(Map<MyEnum, OtherObj> myMap) {
        this.myMap = myMap;
      }
    }
    

    http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-annotation-config를 살펴보십시오.

    업데이트 됨

    문제는 util 스키마에 따르면 키 또는 값 유형을 지정할 수 없다는 것입니다. 그러나 자신 만의 MapFactoryBean을 구현할 수 있습니다 (org.springframework.beans.factory.config.MapFactoryBean에서 상속). 하나의 ceveat - 일반적인 정의 (심지어 런타임에 지운 것 같아서)가 방해가되지 않는다는 것을 알아 두십시오.

  5. ==============================

    5. 요소는 key-type, resp를가집니다. key의 클래스를 나타내는 value-type 속성. 값. key-type 속성에서 열거 형의 정규화 된 클래스를 지정하면 키를지도를 만들 때 해당 열거 형으로 파싱합니다.

    요소는 key-type, resp를가집니다. key의 클래스를 나타내는 value-type 속성. 값. key-type 속성에서 열거 형의 정규화 된 클래스를 지정하면 키를지도를 만들 때 해당 열거 형으로 파싱합니다.

    스프링은 주입 중에지도가 포함 된 클래스에서 선언 된 것과 같이지도의 키 및 값 유형이지도 bean의 키 및 값 유형과 할당 호환된다는 것을 검증합니다. 이것은 실제로 당신이 예외를 얻는 곳입니다.

  6. ==============================

    6.HashMap과 Abstract 또는 인터페이스가 아닌 구체적인 Map 클래스를 사용해야합니다.

    HashMap과 Abstract 또는 인터페이스가 아닌 구체적인 Map 클래스를 사용해야합니다.

    public class Mick {
    
      private HashMap<MyEnum, OtherObj> myMap;
    
      @Autowired
      public void setMyMap(HashMap<MyEnum, OtherObj> myMap) {
        this.myMap = myMap;
      }
    }
    
    
    public class AppConfig
    {
        @Bean
        public HashMap<MyEnum, OtherObj> myMap() { .. }
    }
    
  7. from https://stackoverflow.com/questions/1174308/spring-how-do-you-set-enum-keys-in-a-map-with-annotations by cc-by-sa and MIT license