具有与Java类名匹配的参数的Groovy模板引擎

时间:2017-06-07 00:27:20

标签: groovy

我确定这是一个简单的......

我们使用Groovy模板引擎将XML文档格式化为人类可读的形式。代码扫描XML并创建一个映射,其中包含XML中每个项的条目,然后将其传递给Groovy模板引擎。

当XML包含与类名匹配的属性时,会出现问题 -  像这样:<Date>some date</Date>。如果模板文件指定Date is $Date(例如),而不是实际的日期字符串,我们将获得class java.util.Date。我们尝试过$Date ${Date}${Date.toString()}之类的变体,但没有运气。

我们认为问题在于Groovy将Date与输入变量和java.util.Date类混淆,但我确定有某种语法可以使其正常工作。由于我们通过这个提供任意用户定义的XML,我们实际上无法控制XML中的属性名称。

这里有几行代码来复制问题:

def map = [:]
map.putAt("Date",  new Date())  // Fails
map.putAt("Date2", new Date())  // Works
def tf = new File("Test.template")
def gte = new GStringTemplateEngine()
def tpl = gte.createTemplate(tf).make(map.withDefault{null})
println tpl.toString()

&#34; Test.template&#34;文件包含:

Date is ${Date.toString()}.
Date is ${Date2.toString()}.

我们获得的输出是:

Date is class java.util.Date.
Date is Tue Jun 06 20:22:16 EDT 2017.

2 个答案:

答案 0 :(得分:0)

是的,似乎groovy在绑定名为Date的变量

之前需要类Date

那么,为什么不将所有xml属性作为一个绑定变量传递:

def map = [:]
map.putAt("Date",  new Date())  // Fails
map.putAt("Date2", new Date())  // Works
def gte = new groovy.text.GStringTemplateEngine()
def tpl = gte.createTemplate('''
Date  :: ${ctx.Date.toString()}
Date2 :: ${ctx.Date2.toString()}
''').make( [ctx:map].withDefault{null})

println tpl.toString()

也可以通过这种访问者delegate.'My strange Variable'访问变量:

def map = [:]
map.putAt("Date",  new Date())  // Fails
map.putAt("Date2", new Date())  // Works
def gte = new groovy.text.GStringTemplateEngine()
def tpl = gte.createTemplate('''
Date  :: ${delegate.'Date'.toString()}
Date2 :: ${Date2.toString()}
''').make( map.withDefault{null})

println tpl.toString()

答案 1 :(得分:0)

在这里回答我自己的问题,以防其他人遇到类似的问题。

我们发现Groovy“getVariable()”方法是一个适合我们的解决方案。 getVariable()方法返回任何变量的值,并在模板引擎中公开。将上面示例中的模板更改为:

Date is ${getVariable("Date")}

解决了我们的问题。