我收到了一个与我使用Rhino的项目相关的奇怪电子邮件(没有Java 8,所以我不能使用Nashorn)。原帖[{3}}。那家伙收到一个巨大的堆栈跟踪,相关元素(我认为)是最后一个读取(重新格式化了一点):
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
是我的。带有罪魁祸首的相关代码段是这样的(SCOPE
是Scriptable
; REGEX_IS_VALID
和REG_MATCH
是[rhino] Function
s):
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的名称,我没有&#39;知道标准库的语言。例如,在here中,海报尝试并重新定义:
Date.LZ = function(x) {return(x<0||x>9?"":"0")+x};
请注意,堆栈跟踪中存在尝试覆盖的名称。但我不知道,我也不相信我会做那种事情。我唯一的JavaScript&#34;代码&#34;这是(我知道,错误的命名):
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&#34;除了我和#34;这怎么可能发生?
答案 0 :(得分:0)
好的,所以我解决了问题......
犀牛的知识在互联网上确实非常稀缺,但无论如何,我以最简单的方式解决了这个问题:
- SCOPE = ctx.initStandardObjects(null, true);
+ SCOPE = ctx.initStandardObjects(null, false);