簡體   English   中英

為什么Rhino Javascript引擎抱怨功能不存在?

[英]Why does Rhino Javascript engine complain a function does not exist?

請原諒我,因為我是一名涉足Javascript業務的Java人:)

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

在Java應用程序中,我將javascript引擎本身綁定為jsengine腳本,以便可以加載javascript文件( 包括Rhino eval期間的JavaScript文件 )。

我有兩個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
    }

}

但是,Rhino引擎抱怨以下異常。 由於某種原因,它似乎不喜歡調用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

有人遇到過Rhino這類問題嗎?

PS這個問題似乎相關,但是也沒有給出答案( Rhino中的TypeError:從Java 6到Java 7的遷移

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

傻我...:P

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM