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.

Другие вопросы по тегам