在 Grails 2.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']
最终不是 Message
,而是 RuntimeBeanReference
的一个实例,与 beanName=<msgbean>
;所以我尝试调用getSource()
其上,返回 null,这可能会发生 according到文档(对我来说不行)
为什么ref()
不适用于嵌套 map ?
替代:内联 DSL 配置
这样的东西也很好;这可能吗?试了一下,返回一个闭包,执行时返回“hello”;这并不奇怪,但不是我想要的;需要Message
而是实例。
bean3(ConfigObj){
prop = [key:[msg:{Message -> {
text = 'hello'
}
]]
}
最佳答案
为了在运行时自动解开RuntimeBeanReference
,在 spring 上下文中配置的 Map 需要是 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')]
}
现在,映射都包含第一级的运行时引用,因此都将被正确“管理”。
关于spring - ref() 没有在 grails 上使用 spring dsl 获取嵌套映射值的 bean 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23986200/