2014-01-10 72 views
0

請原諒我,因爲我是一個涉足JavaScript業務的Java人:)爲什麼Rhino Javascript引擎抱怨一個函數不存在?

我希望能夠定義一套集成測試用例,使其易於在Java應用程序中使用腳本。我認爲Javascript將是一種完美的語言來對抗。爲此,我通過Java的Scripting API使用JDK 7附帶的Rhino引擎。這些腳本可以訪問已經在應用程序中定義的Java類,並且可以重用它來定義集成測試的用例場景。

在Java應用程序中,我將javascript引擎本身綁定到jsengine腳本,以便我可以加載JavaScript文件(Including a JavaScript file during Rhino eval)。

我有兩個JavaScript文件,定義如下:

Function.js:

function send(msg) { 
    send.sendMessage(msg); 
} 

TestCase.js

jsengine.eval(new java.io.FileReader("Function.js"); 

sendMsg("Test Message"); 

我也有以下對象定義並綁定到腳本爲「javaobj」:

public class TestConnection { 

    ... 

    public void send(String message) { 
     // Code to send the string message via JMS 
    } 

} 

但是,犀牛引擎抱怨以下異常。它似乎不喜歡調用javaobj的send方法,出於某種原因。

javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: TypeError: Cannot find function send in object 
function sendMsg(msg) {...}. (TestCase.js#3) in TestCase.js at line number 3 
    at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:224) 
    at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:212) 
    at com.foo.test.scenario.JavaScriptEngine.execute(JavaScriptEngine.java:56) 
    at com.foo.test.TestSuite.start(TestSuite.java:88) 
    at com.foo.test.TestSuite.main(TestSuite.java:41) 
Caused by: sun.org.mozilla.javascript.internal.EcmaError: TypeError: Cannot find function send in object 
function sendMsg(msg) {...}. (TestCase.js#3) in TestCase.js at line number 3 
    at sun.org.mozilla.javascript.internal.ScriptRuntime.constructError(ScriptRuntime.java:3773) 
    at sun.org.mozilla.javascript.internal.ScriptRuntime.constructError(ScriptRuntime.java:3751) 
    at sun.org.mozilla.javascript.internal.ScriptRuntime.typeError(ScriptRuntime.java:3779) 
    at sun.org.mozilla.javascript.internal.ScriptRuntime.typeError2(ScriptRuntime.java:3798) 
    at sun.org.mozilla.javascript.internal.ScriptRuntime.notFunctionError(ScriptRuntime.java:3869) 
    at sun.org.mozilla.javascript.internal.ScriptRuntime.getPropFunctionAndThisHelper(ScriptRuntime.java:2345) 
    at sun.org.mozilla.javascript.internal.ScriptRuntime.getPropFunctionAndThis(ScriptRuntime.java:2312) 
    at sun.org.mozilla.javascript.internal.Interpreter.interpretLoop(Interpreter.java:1524) 
    at sun.org.mozilla.javascript.internal.Interpreter.interpret(Interpreter.java:854) 
    at sun.org.mozilla.javascript.internal.InterpretedFunction.call(InterpretedFunction.java:164) 
    at sun.org.mozilla.javascript.internal.ContextFactory.doTopCall(ContextFactory.java:429) 
    at com.sun.script.javascript.RhinoScriptEngine$1.superDoTopCall(RhinoScriptEngine.java:116) 
    at com.sun.script.javascript.RhinoScriptEngine$1.doTopCall(RhinoScriptEngine.java:109) 
    at sun.org.mozilla.javascript.internal.ScriptRuntime.doTopCall(ScriptRuntime.java:3163) 
    at sun.org.mozilla.javascript.internal.InterpretedFunction.exec(InterpretedFunction.java:175) 
    at sun.org.mozilla.javascript.internal.Context.evaluateReader(Context.java:1159) 
    at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:214) 
    ... 4 more 

有沒有人遇到這種類型的問題與犀牛?

P.S.這個問題似乎有關,但沒有給出答案(TypeError in Rhino: migration from Java 6 to Java 7

+0

可能需要更多的代碼在這裏。這裏的代碼看起來是正確的,至少對我來說,但也許你沒有顯示的代碼有問題。 –

回答

0

看起來像我找到了我自己的答案。 Javascript函數和綁定的Java對象的名稱之間存在名稱衝突。兩者具有相同的名稱,引擎會嘗試調用Function對象上不存在的方法!

傻我...:P

+0

我仍然不知道你是如何解決它的。我寫了一個使用Java和Javascript代碼混合的Ant腳本定義。我想調用我的變量trim()並得到類似的錯誤。我該如何去告訴mozilla引擎使用Java版本,甚至是Javascript版本,因爲兩者都應該這樣做? – Malvon

相關問題