Сценарий: у меня есть веб-приложение GWT, работающее в JavaFX WebView / WebEngine. Я могу без проблем передавать строки из GWT в JavaScript в JavaFX.
Проблема: при передаче таким же образом массива настраиваемых объектов, таких как Data [], результат на стороне JavaFX равен нулю.
Пример того, как выглядят данные:
public class Data extends Serializable
{
char[] name;
int code;
short bar;
}
Вот код для отправки данных в JavaScript:
public static native void doNativeStuff(String id, Data[] data) /*-{
$wnd.javaInterface.doStuff(id, data);
}-*/;
Я проверил в отладчике, что передаваемый объект Java заполнен данными и выглядит хорошо.
Теперь на стороне JavaFX у меня есть следующий код для добавления javaInterface на страницу:
JSObject win = (JSObject) engine.executeScript("window");
win.setMember("javaInterface", new JavaInterface());
Я знаю, что это работает, потому что я использую его для других методов, которые передают только строки, и они отлично работают.
public void doStuff(String id, Data[] data)
{
// Right here, id == "validId" and data == null
if (data != null)
{
... do what is needed ...
}
}
Обратите внимание, что объект данных определен и доступен с обеих сторон.
Из документации GWT:
Incoming Java type How it appears to JavaScript code
Java array opaque value that can only be passed back into Java code
Я вообще не касаюсь этого в JavaScript, я только передаю его из Java-> JavaScript-> Java, но последний шаг, похоже, не работает.
Я провел последние несколько часов, изучая Stack Overflow, Google, группы GWT, gwtproject.org и т. Д. Но большинство всех примеров показывают, что передается только один аргумент, и почти ни один из них не показывает, что используется массив Java.
Я бы предпочел просто передать объект, а не переходить к-> из JSON, но я попробовал это от отчаяния. Я пытался использовать GSON, но он не работает на стороне клиента GWT. Я пытался использовать GWT AutoBean Framework, но мой объект Data не является допустимым bean-компонентом (я думаю, из-за отсутствия конструктора по умолчанию), и я не могу это изменить в настоящее время.
Я не использую длинные или длинные значения.
Я видел такие примеры:
@com.google.gwt.examples.JSNIExample::staticFoo(Ljava/lang/String;)(s);
Но насколько я могу судить, это просто переход от JavaScript к GWT через JSNI. Я пытаюсь пойти другим путем. Я также не смог найти такого примера для нескольких аргументов.
Я уверен, что здесь есть небольшая настройка, которую мне не хватает, но я еще не смог понять это. Пожалуйста, дайте мне знать, если вы увидите что-то, чего мне здесь не хватает.