2010-04-25 3 views
5

Ich versuche eine Funktion in JavaScript über Java aufzurufen. Dies funktioniert gut, wenn Sie ein Skript direkt als String lesen, aber ich verwende CompiledScripts.javax script wie man eine Funktion in JavaScript aus Java ruft

Wenn ich dies mit einem kompilierten Skript mache, gibt es mir Methode nicht gefunden, wenn ich auch Bindungen hinzufüge. Ohne Bindungen funktioniert es, aber natürlich scheitert die Funktion, weil sie die Bindungen benötigt.

Irgendwelche Ideen?

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); 

TIA

Antwort

10

Hier ist die Lösung, wenn irgendjemand anderer in diese Beulen.

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"); 
    } 
} 
Verwandte Themen