請原諒我,因爲我是一個涉足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)
可能需要更多的代碼在這裏。這裏的代碼看起來是正確的,至少對我來說,但也許你沒有顯示的代碼有問題。 –