ref()未在grails上使用spring dsl获取嵌套映射值的bean配置
在grails2.3.7上,尝试使用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 =
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
),其值是一个映射。