【问题标题】:Why does Rhino Javascript engine complain a function does not exist?为什么 Rhino Javascript 引擎会抱怨某个函数不存在?
【发布时间】:2014-01-29 19:52:41
【问题描述】:

请原谅我,因为我是一名涉足 Javascript 业务的 Java 人 :)

我希望能够定义一组集成测试用例,以便轻松针对 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
    }

}

但是,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 问题?

附:这个问题似乎相关,但也没有给出答案 (TypeError in Rhino: migration from Java 6 to Java 7)

【问题讨论】:

  • 这里可能需要更多代码。这里的代码看起来是正确的,至少在我看来是正确的,但也许你没有显示的代码有问题。

标签: java javascript rhino


【解决方案1】:

看起来我找到了自己的答案。 Javascript 函数与绑定的 Java 对象的名称之间存在名称冲突。两者具有相同的名称,引擎尝试在 Function 对象上调用不存在的方法!

我真傻……:P

【讨论】:

  • 我还是不知道你是怎么解决的。我编写了一个使用 Java 和 Javascript 代码混合的 Ant scriptdef。我试图在我的变量上调用 trim() 并得到类似的错误。我如何告诉 mozilla 引擎使用 Java 版本,甚至是 Javascript 版本,因为两者都应该完成工作?
猜你喜欢
  • 1970-01-01
  • 2020-11-30
  • 2013-03-28
  • 1970-01-01
  • 2012-02-12
  • 2016-10-30
  • 1970-01-01
  • 2022-06-15
  • 2012-05-13
相关资源
最近更新 更多