【问题标题】:"ExecutionException: : Cannot add a property to a sealed object." Except I don't... What is wrong?“ExecutionException: : 无法向密封对象添加属性。”除了我不... 怎么了?
【发布时间】: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是这样的(SCOPEScriptableREGEX_IS_VALIDREG_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


    【解决方案1】:

    好的,所以我解决了这个问题...

    Rhino 知识在互联网上确实非常稀缺,但无论如何,我以最简单的方式解决了它:

    -        SCOPE = ctx.initStandardObjects(null, true);
    +        SCOPE = ctx.initStandardObjects(null, false);
    

    【讨论】:

      猜你喜欢
      • 2016-04-05
      • 2013-09-04
      • 1970-01-01
      • 2018-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-24
      • 2016-03-08
      相关资源
      最近更新 更多