【发布时间】:2014-04-15 17:20:54
【问题描述】:
我收到了一封奇怪的电子邮件,与我使用 Rhino 的项目有关(没有 Java 8,所以我不能使用 Nashorn)。原帖here。这家伙收到了一个巨大的堆栈跟踪,相关元素(我认为)是最后一个读取(重新格式化)的元素:
Caused by: org.mozilla.javascript.EvaluatorException:
Cannot add a property to a sealed object.
at org.mozilla.javascript.DefaultErrorReporter.runtimeError(DefaultErrorReporter.java:61)
at org.mozilla.javascript.Context.reportRuntimeError(Context.java:549)
at org.mozilla.javascript.Context.reportRuntimeError(Context.java:587)
at org.mozilla.javascript.Context.reportRuntimeError0(Context.java:557)
at org.mozilla.javascript.ScriptableObject.addSlot(ScriptableObject.java:1660)
at org.mozilla.javascript.ScriptableObject.getSlotToSet(ScriptableObject.java:1627)
at org.mozilla.javascript.ScriptableObject.put(ScriptableObject.java:223)
at org.mozilla.javascript.IdScriptable.put(IdScriptable.java:150)
at org.mozilla.javascript.ScriptableObject.defineProperty(ScriptableObject.java:1036)
at org.mozilla.javascript.IdScriptable.defineProperty(IdScriptable.java:233)
at org.mozilla.javascript.ScriptableObject.defineProperty(ScriptableObject.java:1057)
at org.mozilla.javascript.IdScriptable.addIdFunctionProperty(IdScriptable.java:451)
at org.mozilla.javascript.NativeString.fillConstructorProperties(NativeString.java:81)
at org.mozilla.javascript.IdScriptable.addAsPrototype(IdScriptable.java:424)
at org.mozilla.javascript.NativeString.init(NativeString.java:60)
at org.mozilla.javascript.Context.initStandardObjects(Context.java:656)
at com.github.fge.jsonschema.core.util.RhinoHelper.<clinit>(RhinoHelper.java:92)
... 72 more
RhinoHelper.java:92 是我的。与罪魁祸首相关的代码sn-p是这样的(SCOPE是Scriptable;REGEX_IS_VALID和REG_MATCH是[rhino]Functions):
static {
final Context ctx = Context.enter();
try {
SCOPE = ctx.initStandardObjects(null, true); // <-- FAILS HERE
ctx.evaluateString(SCOPE, jsAsString, "re", 1, null);
REGEX_IS_VALID = (Function) SCOPE.get("regexIsValid", SCOPE);
REG_MATCH = (Function) SCOPE.get("regMatch", SCOPE);
} finally {
Context.exit();
}
}
经过一番谷歌搜索,我可以收集到的所有信息是,当您密封上下文(我这样做)并尝试重新定义一个函数(或者 JavaScript 的任何名称,我不知道)时,可能会发生此异常标准库的语言)。例如,在this link,发帖人尝试并重新定义:
Date.LZ = function(x) {return(x<0||x>9?"":"0")+x};
请注意,堆栈跟踪中有尝试覆盖的名称。但我没有,而且我不相信我会做任何类似的事情。我唯一的 JavaScript“代码”是这个(我知道,不好的命名):
private static final String jsAsString
= "function regexIsValid(re)"
+ '{'
+ " try {"
+ " new RegExp(re);"
+ " return true;"
+ " } catch (e) {"
+ " return false;"
+ " }"
+ '}'
+ ""
+ "function regMatch(re, input)"
+ '{'
+ " return new RegExp(re).test(input);"
+ '}';
这是我第一次看到这个错误。这家伙还说,除了我的包之外,没有其他包会引入 Rhino 依赖项......
那么,这里发生了什么?我该如何规避这个问题?这是否意味着上下文已经被密封在其他地方?但是,如果这家伙“除了我”不使用 Rhino,这怎么会发生呢?
编辑:用户找到的解决方法...他依赖于导致错误的 Weblogic。
【问题讨论】:
标签: java javascript rhino