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

标签 spring grails groovy dsl

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')]]
   }

bean1bean2正确接线,

  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/

相关文章:

java - 为什么@Table注解在spring的CRUD操作中是可选的

java - Spring 安全: Create Users

java - Hibernate注解-日期无法映射

css - 样式表上的 Grails NumberFormatException

grails - 是否可以在message.properties文件中写入表达式?

jquery - 服务器端(grails Controller )上的json数据为null

java - Elasticsearch 按日期聚合直方图不再适用于脚本

ruby - 帮助评估构建工具

java - mkp.yieldUnescaped 不起作用

spring - Grails GSP标签字段值格式