【问题标题】:Using Groovy for variable expansion in Java properties在 Java 属性中使用 Groovy 进行变量扩展
【发布时间】:2016-12-26 14:06:06
【问题描述】:

我经常使用标准 Java 属性文件来配置我的 Groovy 应用程序。我一直缺少的一个功能是能够使用变量作为属性值的一部分,以便它们可以在使用过程中动态扩展。我认为我可以使用以下设计来提供此功能:

  1. 使用特殊格式注释应扩展的属性。我选择用双感叹号 (!!) 将此类模板括起来。这些属性值本质上是一个模板,可以使用局部变量进行扩展
  2. 在应用程序中使用属性之前,使用 groovy 'evaluate' 方法在模板中展开应用程序变量
  3. 使用前将原始属性键重新分配给新值

所以,如果我有一个属性文件 config.properties,其属性如下:

version=2.3
local_lib=!!${env['GROOVY_HOME']}/${configProps.getProperty('version')}/lib!!

local_lib 属性将从 GROOVY_HOME 环境变量和 version 属性值扩展而来。

在我的应用程序中,我将其编码如下:

//Load the environment variables and configuration file
env=System.getenv()
configFile=new File('config.properties')
configProps= new Properties()
configProps.load(configFile.newDataInputStream())

//Replace configuration property values with their expanded equivalent
configProps.each{
  //if a property value is a template we evaluate it
  if (it.value.startsWith('!!')){
    valTemplate=it.value.replace('!!','"')
    it.value=evaluate(valTemplate)
  }
}

 //then we use the expanded property values 

这似乎有效。当我这样做时

println configProps

我看到值被扩展而不是空

但是,扩展属性的 getProperty 方法返回 null。

assert configProps.getProperty('local_lib')=='C:\\DEVTOOLS\\groovy-2.4.7/2.3/lib'
   |           |                       |
   |           null                    false
   [local_lib:C:\DEVTOOLS\groovy-2.4.7/2.3/lib, version:2.3]

造成这种差异的原因是什么?我本来希望返回属性映射中显示的值。

【问题讨论】:

    标签: java groovy properties-file variable-expansion


    【解决方案1】:

    您的local_lib 值看起来像String,但事实并非如此。它是一个GString,只是在需要时才懒惰地强制转换为String(比如打印出configProps 映射值时)。

    因此,Properties.getProperty() 的一个鲜为人知的效果在这里生效。当实际映射值不是 String 时,Properties.getProperty() 返回null

    因此,为了获得所需的行为,您需要将GString 强制转换为String,然后再将值存储在属性映射中。像这样:

    it.value=evaluate(valTemplate).toString()
    

    it.value=evaluate(valTemplate) as String
    

    那么您应该会在下游看到所需的结果。

    【讨论】:

    • 顺便说一下,正是出于这个原因,我避免在 Groovy 中使用 Properties.getProperty() 和 Properties.setProperty()。在使用 Properties 对象时,我更喜欢使用映射语法和语义。
    • 哦,确实 @BalRog 强制转换为 String 解决了这个问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-07-05
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    • 2018-12-24
    • 1970-01-01
    相关资源
    最近更新 更多