我已经在我的应用程序下面的一段代码,运行脚本设置为代表Groovy的脚本BaseScript
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());'这是一种传递执行上下文的方式 - 而不是设置绑定,这需要明确地设置变量,I只是使用委托机制。 – EvgeniySharapov
我知道,但@BaseScript覆盖你的setScriptBaseClass(DelegatingScript)。你的脚本的基类是MyBaseScriptClass,这不能转换为DelegatingScript –