sun.org.mozilla.javascript.internal.NativeJavaObject не может быть приведен к java.lang.String
Я использую java 6 javax.script, но у меня есть проблема:
Прежде чем я вызываю метод ScriptEngine.eval(), я помещаю некоторые атрибуты в ScriptContext:
scriptContext.setAttribute("Utils", utils, ScriptContext.ENGINE_SCOPE);
В сценарии я называю:
var s = utils.getMyString()
Метод getMyString() Java возвращает строку (java.lang.String).
Тип 's' в scriptContext - это sun.org.mozilla.javascript.internal.NativeJavaObject, который оборачивает экземпляр Java String.
Когда я пытаюсь получить атрибут из контекста в Java с помощью:
(String) scriptContext.getAttribute("s");
я получил
java.lang.ClassCastException:
sun.org.mozilla.javascript.internal.NativeJavaObject cannot be cast to java.lang.String
Когда я пишу в сценарии:
var s = "hello world"
или же
var s = "" + utils.getMyString()
или же
var s = String(utils.getMyString())
все хорошо, потому что это строки javascript, которые можно получить из scriptContext благодаря внутреннему преобразованию.
Я думаю, что NativeJavaObjects должны быть развернуты (см. Sun.org.mozilla.javascript.internal.Wrapper.unwrap()), когда они освобождаются из scriptContext.
Итак, это ошибка? У меня такая же проблема с java7u5.
Я не верю, что я должен сделать:
var s = String(utils.getMyString())
преобразовать строку Java в строку JavaScript, чтобы иметь возможность вернуть ее в виде строки Java...
Спасибо за вашу точку зрения.
1 ответ
Кажется, что проблема похожа на: https://stackru.com/questions/11814010/javascript-rhino-java-float-method-returns-number-or-object и Rhino Javascript: Как преобразовать объект в примитив Javascript?
но в вашем случае я считаю, что:
Context.enter().getWrapFactory().setJavaPrimitiveWrap(false);
скинет NullPointerException. Вы используете Rhino из JDK javax.script, а методы ScriptEngine.eval обертывают все операции обработки контекста (ввод, выход из контекста и т. Д.), Поэтому, если вы вызываете вышеупомянутый код до eval, контекст rhino может не инициализироваться (введите метод, назначающий контекст для текущая тема).
Решением может быть использование Rhino напрямую из org.mozilla и непосредственная обработка контекста: ссылка и вызов кода выше при входе в контекст.
У меня была похожая проблема (и другие тоже), когда я использовал JDKs ScriptEngine и решил ее с помощью Rhino form Mozilla.