2010-04-25 58 views
5

Tôi đang cố gắng gọi một hàm bằng JavaScript thông qua Java. Điều này làm việc tốt khi trực tiếp đọc một kịch bản như một chuỗi nhưng tôi đang sử dụng CompiledScripts.script javax cách gọi một hàm trong JavaScript từ Java

Khi tôi làm điều này với một tập lệnh được biên dịch, nó cho tôi phương pháp không tìm thấy nếu tôi cũng thêm các ràng buộc. Nếu không có sự ràng buộc nó hoạt động nhưng tất nhiên chức năng thất bại bởi vì nó cần các ràng buộc.

Bất kỳ ý tưởng nào?

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

Trả lời

10

Đây là giải pháp nếu bất kỳ ai khác đã đâm sầm vào này.

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"); 
    } 
} 
Các vấn đề liên quan