#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