【发布时间】:2023-03-26 15:37:01
【问题描述】:
我的应用程序中有以下一段运行脚本的代码
CompilerConfiguration compilerConfiguration = new CompilerConfiguration();
compilerConfiguration.setScriptBaseClass(DelegatingScript.class.getName());
GroovyShell shell = new GroovyShell(compilerConfiguration);
try {
String scriptText = "";
try (Scanner scanner = new Scanner(resources[0].getInputStream())){
scriptText = scanner.useDelimiter("\\A").next();
}
DelegatingScript script = (DelegatingScript)shell.parse(scriptText);
script.setDelegate(this.getDelegate());
script.run();
} catch (IOException e) {
throw new IllegalArgumentException("Cannot read script resource: '" + filename + "': " + e.getLocalizedMessage(), e);
}
它适用于 Groovy 脚本,直到我开始将一些功能重构到 @BaseScript 类中。所以,例如我有这个 Groovy 类
package com.example.scripts
abstract class MyBaseScriptClass extends Script {
int getTheMeaningOfLife() { 42 }
}
然后我有脚本
package scripts
import com.example.scripts.MyBaseScriptClass
import groovy.transform.BaseScript
@BaseScript MyBaseScriptClass baseScript
add(context.application, 'test', theMeaningOfLife )
运行失败,报错:
Caused by: java.lang.ClassCastException: scripts.Script1 cannot be cast to groovy.util.DelegatingScript
at com.metlife.harmony.scripts.groovy.dsl.RunScript.call(RunScript.java:86) ~[classes/:?]
也就是说,如果我在课堂上使用 @BaseScript ,它无法将其转换为 DelegatingScript ?有什么解决办法吗?
【问题讨论】:
-
只是让 MyBaseScriptClass 扩展 DelegatingScript ? RunScript 看起来像一个自定义代码,需要将脚本转换为 DelegatingScript
-
不,扩展
DelegatingScript不起作用。我需要将脚本强制转换为委托以便为其设置委托script.setDelegate(this.getDelegate());这是一种传递执行上下文的方法 - 而不是设置绑定需要显式设置变量,我只使用委托机制。 -
我知道,但是@BaseScript 会覆盖您的 setScriptBaseClass(DelegatingScript)。您的脚本的基类是 MyBaseScriptClass,这不能转换为 DelegatingScript
-
对,但是
MyBaseScriptClass extends DelegatingScript不起作用,同样的错误。 -
其实错误是不一样的。
theMeaningOfLife在我的脚本中返回null。
标签: groovy