在我的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是从需要参数的工厂方法构造的。
答案 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 */)