2013-10-19 35 views
3

注入一個HashMap <類,列出 >現在,我已經叫A類包含像這樣的屬性: 春天 - 從XML

private Map<Class<?>, List<EntityIndexConfig>> relatedEntitiesMap; 

我最初的想法是注射用幾個鍵他們各自的XML列表,但無法使其工作。相反,我創建了@PostConstruct的方法:

@PostConstruct @SuppressWarnings("serial") 
public void loadRelatedEntities() { 
    /* And here I load it */ 
    relatedEntitiesMap = new HashMap<Class<?>, List<EntityIndexConfig>>(){{ 
     put(Agency.class, new ArrayList<EntityIndexConfig>() {{ 
      add(new EntityIndexConfig("Package.listByAgency", applicationContext.getBean(PackageRepository.class), "agencyId")); 
     }}); 
     /* More entries here... */ 
    } 
} 

儘管它的作品,我希望能有春天的XML文件,如果有可能在此配置。任何想法如何創建一個Map並將類作爲鍵和EntityIndexConfig的列表?

如果你們中的任何人知道我會很感激的幫助。謝謝。

回答

2

,如文檔中描述here您已聲明util命名空間前綴:

<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.0.xsd 
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd"> 

請記住我寫的這個寫意,並且很有可能我在某個地方犯了一個錯字或語法錯誤。但是這至少會讓你非常接近。

+0

謝謝您的幫助。我實際上結束了在這個答案和@ kungfuters之間的混合。基本的區別在於,我沒有在列表中引用bean,而是使用constructor-arg元素創建它們。反正謝謝!它的工作原理並不像分別創建所有東西和引用每個bean那樣糟糕。 :) –

+0

也可以。樂於幫助。祝你的項目好運! – Vidya

0

您可以定義豆類和引用它們的鍵和值,如果你想要,但如果你問我,這是矯枉過正:

<util:map key-type="java.lang.Class"> 
     <entry key="com.MyClass"> 
      <util:list> 
       <ref bean="EntityIndexConfig1"/> 
       <bean class="com.mypackage.SomeEntityIndexConfig/> 
      </util:list> 
     </entry> 
</util:map> 

這是假設:

<bean id="listElementBean"/> 
<bean id="keyBean" class="java.lang.Class" factory-method="forName"> 
    <constructor-arg value="com.MyClass"/> 
</bean> 
<bean id="valueBean" class="java.util.ArrayList"> 
    <constructor-arg> 
     <list> 
      <ref bean="listElementBean" /> 
     </list> 
    </constructor-arg> 
</bean> 
<util:map> 
    <entry key-ref="keyBean"> 
     <ref bean="valueBean" /> 
    </entry> 
</util:map> 
1

一種替代方案:

<bean class="yourpackage.A"> 
    <property name="relatedEntitiesMap"> 
     <map> 
      <entry key="yourpackage.Agency"> 
       <list> 
        <bean class="yourpackage.EntityIndexConfig"> 
         <constructor-arg value="Package.listByAgency"/> 
         <constructor-arg ref="packageRepository" /> 
         <constructor-arg value="agencyId" /> 
        </bean> 
       </list> 
      </entry> 
     </map> 
    </property> 
</bean> 

<bean id="packageRepository" class="yourpackage.PackageRepository" /> 
+0

謝謝!正如我所提到的,我最終使用了你的答案和@Vidya中的答案,它的工作完美無缺。我們在這裏丟失的是map元素的key-type =「java.lang.Class」。謝謝! –

+0

有趣的是,當我運行測試時,Spring的默認轉換器將按鍵轉換爲預期的類,但無論如何......很高興它現在對您有用! – MattSenter