GraalVm - сложный объект Java не может быть проанализирован как объект JavaScript

Я пытаюсь перейти с nashorn на graalvm (Java 11). У меня много сценариев Java.

Описание -> Подключение к проекту Java с использованием maven libs org.graalvm.js: graal-sdk, js, js-scriptengine, org.graalvm.truffle: truffle-api. Версия 1.0.0-rc9.
ScriptEngine создан как 'new ScriptEngineManager(). GetEngineByName("graal.js")';
Затем вы можете создать карту в массиве в карте, как:

Map mapOuter = new HashMap();
Map mapInner = new HashMap();
List arrayInner = new ArrayList();

mapInner.put("1", 3);
arrayInner.add(mapInner);
mapOuter.put("2", arrayInner);

Затем преобразуйте mapOuter в ProxyObject, как ProxyObject.fromMap(mapOuter);
Оцените тестовый JavaScript с помощью кода:

function test(param) {
     print(param["2"]);
     param["2"].forEach(function(inArray){
       print(inArray);
     });
}

Который вызовет ошибку как:

javax.script.ScriptException: org.graalvm.polyglot.PolyglotException: TypeError: сбой INVOKE для чужого объекта из-за: Сообщение не поддерживается: INVOKE

Итак, вопрос: как заставить graalvm правильно передать сложный объект Java в функцию JavaScript?

PS Что я хочу в этом примере, чтобы вызвать объект, как:

печать (пары ["2"][0]["1"]);

и это печатает меня 3.

Что я попробовал:
попытался проанализировать каждый элемент outerMap как ProxyObject/ProxyArray.

Что сработало, если вы измените JavaScript следующим образом:

печать (пары ["2"][0].get("1"));

он будет печатать 3;

1 ответ

В настоящее время (декабрь 2018) используется [] Доступ к значениям Java-карты не поддерживается. Вам необходимо преобразовать карты в ProxyObject делать [] Работа. Как вы сделали с mapOuter объект.

В противном случае это обычная карта Java, на которой вы вызываете .get(key) чтобы получить значение.

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