使用Map类型的构造函数参数定义Spring bean

时间:2012-09-07 14:29:44

标签: spring grails

在我的Grails应用程序中,我正在尝试在resources.groovy中定义一个需要Map类型构造函数arg的Spring bean。我试过这个:

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

但我收到错误消息:

  

org.springframework.beans.factory.BeanCreationException:错误   创建名为'myBean'的bean:无法解析匹配   构造函数(提示:指定简单的索引/类型/名称参数   避免类型歧义的参数)

实现类有一个构造函数,由此定义

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

我的猜测是问题是由于我定义了一个带有单个Map arg的构造函数,它与Groovy为每个类添加的默认构造函数具有相同的签名。

如果是这样,解决方案似乎是添加工厂方法,例如

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

但我不确定如何调用它来定义一个bean(在resources.groovy中),该bean是从需要参数的工厂方法构造的。

1 个答案:

答案 0 :(得分:3)

据我所知,您使用的语法应该有效。是替代语法:

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

在你的情况下工作得更好?如果做不到这一点,那么将地图声明为一个bean本身就应该这样做:

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

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

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