Шаг первый, избегайте JSNI, вам лучше определить метод JsInterop, который обеспечивает тот же доступ к API. JSNI по-прежнему будет работать в GWT2, но JsInterop — это путь вперед для GWT3, и часто его намного легче читать и писать. Это будет выглядеть примерно так:
@JsMethod(name = "someJSFunc", namespace = JsPackage.GLOBAL)
public static native String someJSFunc();
Шаг второй: определите тип Java, который соответствует ожидаемому возвращаемому значению JS. Это будет работать либо с JSNI, либо с JsInterop. В JSNI вы должны создать подкласс JavaScriptObject и предоставить методы для доступа к полям (см. http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html и другие документы для получения более подробной информации, но, как и в первом шаге, я не буду вдаваться в подробности здесь). Для вашего примера объекта это будет выглядеть так в JsInterop:
@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL)
public class SomeReturnObject {
public String abc;
public double def;
}
Очевидно, замените имена полей и типы тем, что подходит для вашего собственного проекта. Дайте этому новому типу имя-заполнитель, вот как будет выглядеть ваш глобальный someJsFunc:
@JsMethod(name = "someJSFunc", namespace = JsPackage.GLOBAL)
public static native SomeReturnObject someJSFunc();
И вы будете использовать его, как вы ожидаете, в простой Java - больше не нужно писать JSNI:
SomeReturnObject object = someJSFunc();
DomGlobal.console.log(object.abc + ": " + object.def);
person
Colin Alworth
schedule
09.09.2019