grails / groovy和wslite - 如何使静态XML动态化?

时间:2015-02-24 23:39:52

标签: xml grails soap groovy

使用grails ws-lite 0.7.2.0,你可以指定一条通过soap发送的XML消息:

  def response = send(SOAPAction: 'http://www.27seconds.com/Holidays/US/Dates/GetMothersDay') {
  body {
     GetMothersDay(xmlns: 'http://www.27seconds.com/Holidays/US/Dates/') {
        year(2011)
     }
  }
}

我需要做的是替换其中一个静态元素,例如" GetMothersDay"使用动态变量,例如:

String action = "GetMothersDay"
def response = send(SOAPAction: 'http://www.27seconds.com/Holidays/US/Dates/GetMothersDay') {
  body {
     $action(xmlns: 'http://www.27seconds.com/Holidays/US/Dates/') {
        year(2011)
     }
  }
}

显然上面的代码不会起作用,但希望它能说明我想要做的事情。

作为一个额外的问题,外面{}的东西是什么?它们是功能定义吗?例如什么是"年(2011)",它不能同时是函数定义和函数调用?

我需要替换位的实际XML消息更长,更复杂 - 但每次调用基本相同。

任何帮助都非常感激 - 如果没有办法做到这一点,我面临着数百行重复代码。

1 个答案:

答案 0 :(得分:1)

如果表达式比一个变量更复杂并且包含空格或其他有问题的字符,请使用$action"$action"而不是"${action}"

这些是方法调用,这通常是Groovy DSL /构建器的工作方式。它们显然不是有效的方法,但是方法缺失/属性缺失处理程序是活动的,只要您调用的方法对DSL有效,它们就会转换为您要构建的内容。通常,方法调用的名称和/或args用作数据并确定调用是否有效。

对于常规groovy.xml.MarkupBuilder(例如in this example),包含Map参数的方法将成为具有从方法名称派生的名称的元素,并且Map项目将成为属性,例如

car(name:'P50', make:'Peel', year:1962) 

<car name='P50' make='Peel' year='1962'>

使用String arg的方法调用成为具有String主体的元素,例如

country('Isle of Man')

变为

<country>Isle of Man</country>

您可以在the source of SOAPMessageBuilder.groovy中看到闭包的delegate已设置为构建器,因此它可以处理调用,并使用MarkupBuilder生成XML字符串。

Programming Groovy 2特别擅长在Groovy中创建DSL。