【问题标题】:Populate List<Callable<String>> in Groovy with Groovy objects在 Groovy 中使用 Groovy 对象填充 List<Callable<String>>
【发布时间】:2012-09-18 21:19:48
【问题描述】:

What JVM-based scripting language support @WebService to create services at runtime? 中,有人建议我使用 Groovy 来提供在运行时读取的脚本中配置的 Web 服务。

为了使这项工作与我们现有的基础设施一起工作,我基本上需要能够向List&lt;Callable&lt;String&gt;&gt; 添加新条目,然后我可以要求执行程序对其进行调用。

基本结构如下:

  • 使用 GroovyScriptEngine 嵌入 Groovy
  • 在传入的绑定中作为“l”从 Java 传入的初始列表。
  • Groovy 脚本定义并实例化 N 个对象,均实现 Callable&lt;String&gt; 并将它们添加到列表中。
  • 在 Java 中,列表会被进一步处理,然后传递给执行程序。

我最初的微弱步骤表明我很可能需要使用def c = { ... } as Callable&lt;String&gt;,但随后我得到了 ClassCastException。阅读起来,我发现这似乎有点困难,并且涉及到闭包。

在实现Callable&lt;String&gt; 的 Groovy 中定义和实例化对象的正确方法是什么?

【问题讨论】:

  • 您使用的是什么版本的 Groovy? Closure 已经在 Groovy 1.8 及更高版本中实现了 Callable。
  • @IanRoberts 我从 Maven 中提取了 groovy-all-1.0-jsr-05,它似乎是最新的。 org.codehaus.groovy.runtime.InvokerHelper.getVersion() 报告“1.0-jsr-05”。我应该使用其他东西吗?
  • 那是相当古老的 TBH。 org.codehaus.groovy:groovy-all:2.0.2 是最新的。
  • 我更新了,现在脚本可以工作了。您能否发表一个我可以接受的答案?

标签: groovy embed


【解决方案1】:

在 Groovy 1.8 及更高版本中,groovy.lang.Closure 默认实现 Callable,因此您不需要任何“as”魔法。简单地说:

l << { "hello" }
l << { "world" }

对于 Groovy 的早期版本(当然是 1.6 和 1.7,不确定“古老”版本),您需要使用 as

import java.util.concurrent.Callable

l << ({ "hello" } as Callable)

【讨论】:

    猜你喜欢
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 2013-11-06
    相关资源
    最近更新 更多