3

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

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

但我收到错误消息:

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

实现类有一个这样定义的构造函数

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

我的猜测是,问题是由于我定义了一个构造函数,该构造函数采用单个Maparg,其签名与 Groovy 添加到每个类的默认构造函数具有相同的签名。

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

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

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

4

1 回答 1

4

据我所知,您使用的语法应该可以工作。是否替代语法:

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 */)
于 2012-09-07T15:04:32.593 回答