Не удается получить доступ к свойству объекта Java, переданного в ScriptEngine

#java #properties #scriptengine #graaljs

Вопрос:

Я передаю объект «transformContext» из Java в Graal.js Игра по сценарию. Объект содержит хэш-карту под названием «dataRecordsByName», доступ к которой в Java я обычно могу получить с помощью следующей строки:

transformContext.get("dataRecordsByName")

Я пытаюсь извлечь хэш-карту из движка. Я подумал, что для этого мне нужно заменить приведенную выше строку на:

engine.eval("transformContext.dataRecordsByName")

Однако это просто возвращает неопределенное значение.

Вот мой полный код для этой задачи:

 ScriptEngine engine = new ScriptEngineManager().getEngineByName("graal.js");
engine.put("transformContext",transformContext);
engine.eval("console.log(transformContext)");
engine.eval("console.log(transformContext.dataRecordsByName)");
 

А вот и вывод на консоль:

TransformContext(dataRecordsByName={$=[], CONVERSION=[{«From_Currency»:»AUD»,»To_Currency»:»AUD»,»Conversion_Rate»:1.0,»historical_date»:»31/05/2021″,»organisation_id»:»ParentId»,»organisation_currency»:»GBP»,»organisation_name»:»Идентификатор родителя»}],…}, ObjectMapper=com.fasterxml.jackson.databind.ObjectMapper@21dfdc26)

не определено

Кто-нибудь знает, почему движок не может получить свойство dataRecordsByName?

Ответ №1:

После некоторых дальнейших исследований кажется, что graal.js по умолчанию не отображает свойства, как я ожидал, но может сделать это, если вы запустите его в режиме совместимости с nashorn.

System.setProperty("polyglot.js.nashorn-compat", "true");

После этого вы можете получить свойства объекта, как обычно в JavaScript:

engine.eval("console.log(transformContext.dataRecordsByName)");

Спасибо ребятам в этой теме: https://github.com/oracle/graaljs/issues/169