2011-11-14 45 views
0

在使用Spring時,我面臨一個奇怪的問題。我有一個類需要一個集合作爲輸入,因爲該類是基礎框架,所以我無法更改它。 這裏是它的聲明如何定義一個自定義的集合實現用於<set></set>

private Set evaluate; 

public Set getEvaluate() 
    { 
     return evaluate; 
    } 

public void setEvaluate(Set evaluate) 
    { 
     this.evaluate = evaluate; 
    } 

我是春天的文件我有以下條目

<bean id="customService" 
     class="com.platform.impl.DefaultFrameworkService" 
     scope="tenant" parent="abstractService"> 
     <property name="evaluate"> 
      <set> 
       <ref bean="bean1" /> 
       <ref bean="bean2" /> 
       <ref bean="bean3" /> 
       <!-- inject new bean here. --> 
       <ref bean="bean4" /> 
      </set> 
     </property> 

這裏DefaultFrameworkService需要設置爲輸入。所以我試圖將一個新的bean注入到底層服務。

我的問題是,當春天讀取這個文件它sprong.xml這個<set>進入轉換爲LinkedHashSet,比嘗試將這些值設置爲private Set evaluate最終拋出異常。

雖然我總是可以覆蓋DefaultFrameworkService,並且可以將該LinkedHashSet轉換爲設置,但希望尋找更好的方法。

異常即時得到是

Failed to convert property value of type 'java.util.LinkedHashSet' to required type 'java.util.Set' for property 'evaluate' 

我怎樣才能讓春天來傳遞值僅作爲set而不是LinkedHashSet

更新

我無法將所有這些即便如此我玩了一下創造了一個新的自定義類,即CustomDefaultFrameworkService與以下implimentation

public class CustomDefaultFrameworkService extends DefaultFrameworkService 
{ 

    Logger log = Logger.getLogger(CustomDefaultFrameworkService.class); 
    @SuppressWarnings("unused") 
    private Set evaluate; 

    /** 
    * @param evaluateStrategies 
    *   the evaluateStrategies to set 
    */ 
    @Override 
    public void setEvaluate(final Set evaluate) 
    { 
     log.info("Setting values to super class. Total values being injected are " + evaluateStrategies.size()); 
     super.setEvaluate(evaluate); 

    } 
} 

我可以設置地圖超級類。這件事讓我更加困惑。

+1

甲'LinkedHashSet' 「是」'Set'。它拋出了什麼錯誤? – Bringer128

+0

爲什麼你要在同一個集合中兩次使用'?也許這就是失敗? –

+0

@ Bringer128:請參閱我的帖子,我已更新它。 –

回答

1

使用util namespace,它的元素set有一個參數set-class,您可以在其中指定要使用的實現。

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


<util:set id="emails" set-class="my.custom.set.implmentation"> 
    <value>[email protected]</value> 
    <value>[email protected]</value> 
    <value>[email protected]</value> 
    <value>[email protected]</value> 
</util:set> 

</beans> 

@see Spring Reference Chapter C.2.2.6

+0

請查看我的更新後 –

+0

對不起,但首先我完全不明白這個問題。你相信春天適合一堂課,但不適合另一堂課?我想你的代碼中有一些錯誤。例如:你的'CustomDefaultFrameworkService'作爲setter不會寫入字段!所以如果你需要支持一個特定的問題。首先編寫一個示例應用程序以確保行爲不會形成其他bean,然後打開一個新的問題(帶有欺騙性標題),描述行爲,添加代碼,添加彈簧配置和完整的堆棧跟蹤。 – Ralph

相關問題