2014-04-15 4 views
0

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입니다. 범인 라인 관련 코드는 (SCOPEScriptable입니다 REGEX_IS_VALIDREG_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에 의존했습니다.

답변

0

OK, 그래서 ...

코뿔소 지식은 인터넷에 정말 놀라 울 정도로 부족 문제를 해결하지만, 어쨌든, 나는 가장 간단한 가능한 방법으로 그것을 수정 :

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