0

我正在 Groovy 中创建一个 DSL 来进行 Http 端点测试,我希望它是自然语言的,并且我有具有“with”方法的对象。当我链接命令时,我的方法被正确调用,但是如果在变量脚本上调用 'with' 方法,则编译失败,因为使用了现有的 Groovy 'with(Closure)'。使用 GroovyShell 读取和执行 DSL 脚本文件。

这有效:

request = http GET to "${url}" with headers, [ 'Cookie': 'monster' ]

但这不会:

request = http GET to "${url}"
request with headers, [ 'Cookie': 'monster' ]

被调用的对象是用 Java 编写的,但可以移动到 Groovy。这是方法签名:

<returns this> with(HttpMethodElement eml, Object value);

从返回的错误看来,它似乎没有找到带有方法的 Java,并抱怨没有传入闭包。如果我添加显式括号,我会得到一个找不到方法的异常。这是令人困惑的,因为它是在分配给变量之前发现的......

expecting EOF, found ',' @ line 6, column 31.
request = request with headers, [ 'Cookie': 'monster' ]
                              ^

我认为 Groovy 可能正在将 Java 对象转换或包装成脚本中的 Groovy 对象,但这两种方法具有不同的签名并且应该是合法的。

4

1 回答 1

0

这是解析器

Groovy 看到

request = http GET to "${url}" with headers, [ 'Cookie': 'monster' ]

作为

request = http( GET ).to( "${url}" ).with( headers, [ 'Cookie': 'monster' ] )

如您所见,这很好,但是当它尝试解析时

request with headers, [ 'Cookie': 'monster' ]

被视为

request( with headers, [ 'Cookie': 'monster' ] )

所以 with 成为一个参数,然后你错过了一个逗号,它会导致你的问题。基本上解析器迷路了

于 2013-07-18T19:58:34.767 回答