如何只使用Grails中嵌套的地图创建ConfigObject?(How to create Con

2019-10-21 01:50发布

它可以实现基于闭包的配置作为地图的地图?

grails {
  acme {
     host = 'localhost'
     poolSettings {
        timeout = 5000
     }
  }
}

以上配置是一个Grails插件的约定。 我们做了迁移,并且由于传统的限制,我们需要动态创建的配置,以消除影响,遗留代码。

我开始用一个简单的配置:

grails.acme = [host:'localhost']

这工作正常启动时的插件,所以我增加了一个嵌套的地图:

grails.acme = [host:'localhost']
def poolProps = //do some work to get pool settings
grails.acme << [poolSettings:poolProps]

在启动时,我很打印grails.acme

{
    "host": "locahost",
    "poolSettings": {
        "timeout": 5000
    }
}

它看起来正常,但失败并出现以下错误极致插件后不久:

2014-09-27 23:27:07460 [本地主机 - startStop-1] ERROR context.GrailsContextLoader - 错误初始化应用程序:方法的无签名:AcmePlugin $ _closure2_closure5_closure9 .doCall()是适用于参数类型:(grails.spring。 BeanBuilder)的值:[grails.spring.BeanBuilder@7b067fd7]可能的解决方案:doCall(java.lang.Object中,java.lang.Object中),()调用,调用([Ljava.lang.Object),调用(Java的。 lang.Object),电话(java.lang.Object中,java.lang.Object中)的findAll()消息:法无签名:AcmeGrailsPlugin $ _closure2_closure5_closure9.doCall()是适用于参数类型:(grails.spring.BeanBuilder)值:[grails.spring.BeanBuilder@7b067 FD7]可能的解决方案:doCall(java.lang.Object中,java.lang.Object中),()调用,调用([Ljava.lang.Object),呼叫(java.lang中.Object),电话(java.lang.Object中,java.lang.Object中)

我对这种难倒,我猜想这是不可能的,我不知道如何甚至是动态接近封基约定。

Answer 1:

与您的代码的一个问题可能是,config节点结构看起来完全正确,但实际上并非如此。 即有些节点是Map的情况下,但不是ConfigObject实例。

在大多数情况下,这可能并不重要,但在你的情况下,它似乎是一个第三方插件失败,一些丑陋的和难以理解的异常。

我无法重现你的问题,所以我不能肯定地说这是否是您所遇到的实际问题,也不是是否建议的解决方案解决您的问题。 尽管如此,我第一次尝试将固定类型,这样的配置树中的所有节点都是类型的ConfigObject 。 事情是这样的:

def poolProps = [timeout: 5000] as ConfigObject // convert type to ConfigObject
grails.acme.host = 'localhost'
grails.acme << [ poolSettings : poolProps ]

请注意,如果您创建的地图(在这种情况下poolProps)包含嵌套的地图元素,你将不得不转换那些为好。



Answer 2:

是的,它是可能的,实际上

grails {
   acme {
      host = 'localhost'
      poolSettings {
         timeout = 5000
      }
   }
}

是相同的:

grails.acme.host = 'localhost'
grails.acme.poolSettings.timeout = 5000

封盖只是语法糖。 你甚至可以结合这两种类型:

grails.acme {
   host = 'localhost'
   poolSettings.timeout = 5000
}


文章来源: How to create ConfigObject using only nested maps in Grails?