2013-09-05 3 views
1

Мой проект отлично работает на Java 6 (разные обновления и ОС). Он использует Rhino в качестве механизма сценариев. Теперь нам нужно перейти на Java 7, и я нашел одну проблему, которая мешает нам это сделать. У нас есть такой код:TypeError в Rhino: переход с Java 6 на Java 7

Context.enter(); 
try { 
    ScriptEngine js = new ScriptEngineManager().getEngineByName("js"); 
    final ScriptContext context = new SimpleScriptContext(); 
    context.setAttribute("console", new Object() { 
     public void log(String out) { 
      logger.info(out); 
     } 
    }, ScriptContext.ENGINE_SCOPE); 
    js.setContext(context); 
    js.eval("console.log('test')"); 
} catch (ScriptException e) { 
    logger.error(e); 
    e.printStackTrace(); 
} finally { 
    Context.exit(); 
} 

Это хорошо работает в Java 6, но Java 7 кидает исключение

javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: TypeError: Cannot find function log in object [email protected] (<Unknown source>#1) in <Unknown source> at line number 1 
at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:224) 
at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:240) 
at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:264) 
at JSDebugTest.testJS1(JSDebugTest.java:54) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:606) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) 
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:300) 
at org.junit.runner.JUnitCore.run(JUnitCore.java:157) 
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:76) 
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:195) 
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:606) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 
Caused by: sun.org.mozilla.javascript.internal.EcmaError: TypeError: Cannot find function log in object [email protected] (<Unknown source>#1) 
at sun.org.mozilla.javascript.internal.ScriptRuntime.constructError(ScriptRuntime.java:3771) 
at sun.org.mozilla.javascript.internal.ScriptRuntime.constructError(ScriptRuntime.java:3749) 
at sun.org.mozilla.javascript.internal.ScriptRuntime.typeError(ScriptRuntime.java:3777) 
at sun.org.mozilla.javascript.internal.ScriptRuntime.typeError2(ScriptRuntime.java:3796) 
at sun.org.mozilla.javascript.internal.ScriptRuntime.notFunctionError(ScriptRuntime.java:3867) 
at sun.org.mozilla.javascript.internal.ScriptRuntime.getPropFunctionAndThisHelper(ScriptRuntime.java:2343) 
at sun.org.mozilla.javascript.internal.ScriptRuntime.getPropFunctionAndThis(ScriptRuntime.java:2310) 
at sun.org.mozilla.javascript.internal.gen._Unknown_source__2._c_script_0(<Unknown source>:1) 
at sun.org.mozilla.javascript.internal.gen._Unknown_source__2.call(<Unknown source>) 
at sun.org.mozilla.javascript.internal.ContextFactory.doTopCall(ContextFactory.java:433) 
at sun.org.mozilla.javascript.internal.ScriptRuntime.doTopCall(ScriptRuntime.java:3161) 
at sun.org.mozilla.javascript.internal.gen._Unknown_source__2.call(<Unknown source>) 
at sun.org.mozilla.javascript.internal.gen._Unknown_source__2.exec(<Unknown source>) 
at sun.org.mozilla.javascript.internal.Context.evaluateReader(Context.java:1159) 
at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:214) 
... 30 more 

Проблема исчезает, если извлечь анонимный объект для внутреннего класса. Любая идея, как исправить это без ScriptableObject.get (слишком много мест, где мы создаем такой объект и какой-то сторонний код, который мы используем, использует тот же подход)?

ответ

1

У меня была точно такая же ошибка, и после вашего комментария «Проблема исчезнет, ​​если я извлечу анонимный объект во внутренний класс». Я обнаружил, что созданный внутренний класс будет иметь модификатор доступа по умолчанию (иногда называемый модификатором доступа к пакету). По-видимому, скриптовый API в JDK7 не обрабатывает эти определения!

Вместо этого я использую определение «статического общественного».

0

У вас была аналогичная проблема. Я проходил в частном внутреннем классе, и он терпел неудачу. Я изменил его с частного внутреннего объекта на открытый класс, и он отлично справился с обновлением Java 7.

0

Я также получил TypeError при переходе с Java 6 на 7: мой JavaScript вызывал метод в классе Java, который имел видимость по умолчанию (пакет-частный). Должен был сделать класс публичным для его работы.

0

Была такая же проблема. В моем случае это был не внутренний класс, но класс верхнего уровня имел защиту по умолчанию (уровень пакета). Переход на public исправил мои проблемы ... стыдно, мне потребовалось пару часов, чтобы понять это.

Смежные вопросы