2010-04-25 8 views
5

J'essaie d'appeler une fonction en JavaScript via Java. Cela fonctionne correctement lors de la lecture directe d'un script sous forme de chaîne, mais j'utilise CompiledScripts. Lorsque je fais ceci avec un script compilé, il me donne la méthode non trouvée si j'ajoute aussi des bindings. Sans bindings cela fonctionne mais bien sûr la fonction échoue car elle a besoin des bindings.script javax comment appeler une fonction en JavaScript depuis Java

Des idées?

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

Répondre

10

est ici la solution si on se cogne d'autre dans ce.

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