Rhino를 사용하는 프로젝트와 관련된 이상한 이메일을 받았습니다 (Java 8이 없으므로 Nashorn을 사용할 수 없음). 원본 게시물 here. 남자는 거대한 스택 트레이스를 수신하고 관련 요소는 (내 생각) (조금 포맷) 읽고 마지막 하나입니다 나의"ExecutionException : : 봉인 된 객체에 속성을 추가 할 수 없습니다." 내가 싫어할 때를 제외하고 ... 뭐가 잘못 됐니?
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
이 [코뿔소] Function
들입니다)이 있습니다 : 주위에 인터넷 검색을 몇 후
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};
을 그리고 스택 트레이스의 시도 재정의 이름 있음을 유의하십시오. 그러나 나는 그렇지 않습니다. 그리고 저는 제가 그런 종류의 일을한다고 믿지 않습니다. 내 유일한 자바 스크립트 "코드"는 다음과 같습니다 (잘못된 이름 지정).
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에 의존했습니다.