Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ref()未在grails上使用spring dsl获取嵌套映射值的bean配置_Spring_Grails_Groovy_Dsl - Fatal编程技术网

ref()未在grails上使用spring dsl获取嵌套映射值的bean配置

ref()未在grails上使用spring dsl获取嵌套映射值的bean配置,spring,grails,groovy,dsl,Spring,Grails,Groovy,Dsl,在grails2.3.7上,尝试使用resources.groovy中的bean引用设置嵌套映射值 msgbean(Message){ text = 'hello' } bean1(ConfigObj){ prop = [ref('msgbean')] } bean2(ConfigObj){ prop = [key: ref('msgbean')] } bean3(ConfigObj){ prop =

grails2.3.7上,尝试使用
resources.groovy中的bean引用设置嵌套映射值

   msgbean(Message){
      text = 'hello'
   }

   bean1(ConfigObj){
      prop = [ref('msgbean')]
   }

   bean2(ConfigObj){
      prop = [key: ref('msgbean')]
   }

   bean3(ConfigObj){
      prop = [key:[msg:ref('msgbean')]]
   }
bean1
bean2
正确接线

  println '1 ' + bean.prop[0].text
  println '2 ' + bean2.prop['key'].text
印刷品

1 hello
2 hello
然而,
bean3
,没有得到它对
msgbean
的引用

println '3 ' + bean3.prop['key']['msg'].text

Error |
No such property: text
仔细看一看,
bean3.prop['key']['msg']
的结尾不是
消息
,而是
RuntimeBeanReference的一个实例,带有
beanName=
;因此,我尝试对其调用
getSource()
,返回null,这可能发生在文档上(对我来说不合适)

为什么
ref()
不适用于嵌套贴图

备用:内联DSL配置

像这样的东西也不错;这可能吗?给它一个机会,返回一个闭包,执行时返回“你好”;这并不奇怪,但不是我想要的;需要
消息
实例

bean3(ConfigObj){
      prop = [key:[msg:{Message -> {
                          text = 'hello'
                       }
               ]]
   }

为了在运行时自动打开
RuntimeBeanReference
s,在spring上下文中配置的映射需要是
org.springframework.beans.factory.support.ManagedMap
——spring DSL会自动将任何包含
RuntimeBeanReference
值的映射转换为
ManagedMap
它只在一个层次上做这件事,它不看地图的内部

有点混乱,但您可以将内部映射本身声明为顶级bean:

bean3Message(org.springframework.beans.factory.config.MapFactoryBean) {
   sourceMap = [msg:ref('msgbean')]
}

bean3(ConfigObj){
   prop = [key:ref('bean3Message')]
}

现在,映射都包含第一级的运行时引用,因此都将被正确“管理”。

另一个适合我的解决方案:

bean3(ConfigObj) {
    prop = [key : ref(bean3Message(org.springframework.beans.factory.config.MapFactoryBean) {
            sourceMap = [msg:ref('msgbean')]
    })]
}
它也很混乱,但您不必将地图定义分散到多个顶级bean中


我在列表中尝试过这一点(使用org.springframework.beans.factory.config.ListFactoryBean和属性sourceList而不是sourceMap)。

Ian,如果
MapFactoryBean
支持一个级别的深度,那么与支持相同的简单映射相比,它们有什么好处?我可以使用内联配置分配映射值吗?(请参阅我的更新)。@raffian这不是特定于
MapFactoryBean
-DSL将转换为
ManagedMap
任何分配给bean属性且至少包含一个RuntimeBean引用作为值的映射。我在这里使用的不是一个相关的
MapFactoryBean
,而是我定义了一个命名bean(
bean3Message
bean3
),它有一个属性(
sourceMap
prop
),其值是一个映射。