sun.org.mozilla.javascript.internal.NativeJavaObject无法强制转换为java.lang.String

时间:2012-07-18 13:03:52

标签: java javascript rhino javax.script

我正在使用java 6 javax.script功能,但我遇到了一个问题:

在调用ScriptEngine.eval()方法之前,我将一些属性添加到ScriptContext:

scriptContext.setAttribute("Utils", utils, ScriptContext.ENGINE_SCOPE);

在脚本中我打电话:

var s = utils.getMyString()

Java getMyString()方法返回一个String(java.lang.String)。

scriptContext中的's'类型是包装Java String实例的sun.org.mozilla.javascript.internal.NativeJavaObject。

当我尝试从Java中使用上下文获取属性时:

(String) scriptContext.getAttribute("s");

我得到了

    java.lang.ClassCastException:
 sun.org.mozilla.javascript.internal.NativeJavaObject cannot be cast to java.lang.String

当我在剧本中写作时:

var s = "hello world"

var s = "" + utils.getMyString()

var s = String(utils.getMyString())

一切都很好,因为这些是javascript字符串,可以通过内部转换从scriptContext获取。

我认为NativeJavaObjects应该从scriptContext中释放出来(见sun.org.mozilla.javascript.internal.Wrapper.unwrap())。

那么,这是一个错误吗?我对java7u5也有同样的问题。

我不相信我必须这样做:

var s = String(utils.getMyString())

将Java字符串转换为JavaScript字符串,以便能够将其作为Java字符串... ...

感谢您的观点。

1 个答案:

答案 0 :(得分:1)

问题似乎与:https://stackoverflow.com/questions/11814010/javascript-rhino-java-float-method-returns-number-or-object类似 和 Rhino Javascript: How to convert Object to a Javascript primitive?

但在你的情况下,我相信:

Context.enter().getWrapFactory().setJavaPrimitiveWrap(false); 

将抛出NullPointerException。 您使用JDK javax.script中的Rhino,ScriptEngine.eval方法包含处理上下文(输入,退出上下文等)的所有操作,因此如果您在eval之前调用上述代码,则可能无法初始化rhino上下文(输入方法分配上下文)当前线程)。

解决方案可能是直接使用Rhino形成org.mozilla并直接处理上下文:link 并在输入上下文时调用上面的代码。

当我使用JDKs ScriptEngine并使用Rhino形式的mozilla解决它时,我遇到了类似的问题(以及其他问题)。