Javax-скрипт, как вызвать функцию в JavaScript из Java
Я пытаюсь вызвать функцию в JavaScript через Java. Это прекрасно работает, когда непосредственно читаете скрипт как строку, но я использую CompiledScripts.
Когда я делаю это с помощью скомпилированного скрипта, он дает мне метод not found, если я также добавляю привязки. Без привязок это работает, но, конечно, функция не работает, потому что ей нужны привязки.
Есть идеи?
CompiledScript script = ... get script....
Bindings bindings = script.getEngine().createBindings();
Logger scriptLogger = LogManager.getLogger("TEST_SCRIPT");
bindings.put("log", scriptLogger);
//script.eval(bindings); -- this way fails
script.eval(); // -- this way works
Invocable invocable = (Invocable) script.getEngine();
invocable.invokeFunction(methodName);
ТИА
1 ответ
Решение
Вот решение, если кто-то еще сталкивается с этим.
import java.util.*;
import javax.script.*;
public class TestBindings {
public static void main(String args[]) throws Exception {
String script = "function doSomething() {var d = date}";
ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
Compilable compilingEngine = (Compilable) engine;
CompiledScript cscript = compilingEngine.compile(script);
//Bindings bindings = cscript.getEngine().createBindings();
Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
for(Map.Entry me : bindings.entrySet()) {
System.out.printf("%s: %s\n",me.getKey(),String.valueOf(me.getValue()));
}
bindings.put("date", new Date());
//cscript.eval();
cscript.eval(bindings);
Invocable invocable = (Invocable) cscript.getEngine();
invocable.invokeFunction("doSomething");
}
}