2012-09-07 87 views
2

在我的Grails應用程序中,我試圖在resources.groovy中定義一個需要Map類型的構造函數arg的Spring bean。我嘗試這樣做:用Map-typed構造函數參數定義Spring bean

Map<Class, String> mapArg = [(String): 'foo'] 
myBean(MyBeanImpl, mapArg) 

但我得到的錯誤信息:

org.springframework.beans.factory.BeanCreationException:錯誤 創建名爲 '爲myBean' 豆:無法解析匹配 構造(提示:指定索引/類型/名稱參數爲簡單 參數,以避免歧義類型)

實現類具有單一的構造,其是這樣定義

MyBeanImpl(Map<Class, String> map) { 
    // impl omitted 
} 

我的猜測是,這個問題是由我定義一個構造函數一個Map ARG具有相同簽名的默認構造函數的Groovy增加了每類造成的事實。

如果是這樣,一個解決方案似乎是添加一個工廠方法,如

MyBean getInstance(Map map) { 
    // impl omitted 
} 

但我不知道我怎麼能叫這種方法來定義一個bean(在resources.groovy)是從構建一個需要參數的工廠方法。

+0

這應該工作。一個輕微的皺紋是,你需要用圓括號將映射定義爲'[(String):'foo']',以便將'Class'對象用作映射鍵而不是字符串「String」,但是我不' t認爲泛型類型參數在決定構造函數是否匹配時很重要。 –

+0

@IanRoberts在代碼本身,我確實有括號括在類的原因你說。我更新了我的問題,很好看。 –

回答

3

據我可以告訴你使用的語法應該工作。替代句法:

Map<Class, String> mapArg = [(String): 'foo'] 
myBean(MyBeanImpl) { bean -> 
    bean.constructorArgs = [mapArg] 
} 

在你的情況下工作更好嗎?否則,宣佈地圖爲豆本身就應該這樣做:

import org.springframework.beans.factory.config.MapFactoryBean 

classMap(MapFactoryBean) { 
    sourceMap = [(String):'foo'] 
} 

myBean(MyBeanImpl, classMap /* this is a RuntimeBeanReference */) 
+0

替代語法似乎工作,謝謝! –