Моя цель - инициировать вызовы RPC прямо из javascript. Я придумал способы имитировать обратные вызовы (из-за асинхронного характера RPC), но я не могу понять, как добавить настраиваемые объекты в javascript.
Итак, я создал класс с именем Interop и статически создаю интересующую меня службу (пришлось использовать static, поскольку это было все, что я мог заставить работать, я не думаю, что это актуально прямо сейчас):
public class Interop {
private static final GreetingServiceAsync service = GWT.create(GreetingService.class);
...
}
Затем я создаю функцию, которая будет выполнять асинхронные вызовы и обрабатывать ответы:
public static void greetServer(final String success, final String failure) {
service.greetServer(
"Homer",
new AsyncCallback<String>() {
public void onFailure(Throwable caught) {
callback(failure, caught.toString());
}
public void onSuccess(String result) {
callback(success, result);
}
}
);
}
Затем я создаю функцию JSNI для экспорта этой функции в javascript, которую я вызываю из onModuleLoad ():
public static native void export() /*-{
$wnd.greetServer = $entry(@package.Interop::greetServer(Ljava/lang/String;Ljava/lang/String;));
}-*/;
А также создайте еще одну функцию JSNI для работы с обратными вызовами:
public static native void callback(String func, String response) /*-{
$wnd[func](response);
}-*/;
Так что имена функций, которые я передаю в greetServer () изначально для успеха и неудачи, вызываются JSNI как обратные вызовы. И все это отлично работает при работе со строками или (я полагаю) примитивным типом. Но когда я пытаюсь сделать это с пользовательскими типами (обратите внимание на измененный параметр пользовательского типа):
public static native void callback(String func, Custom response) /*-{
$wnd[func](response);
}-*/;
Тогда то, что попадает в javascript, не работает. Кажется, это объект javascript с каскадными массивами, и ни один из методов недоступен.
Итак, вопрос в том, как можно получить доступ к объектам Java, которые не являются базовыми или примитивными, изнутри javascript (не JSNI)? Насколько я могу судить, JavaScriptObject должен происходить из javascript, но в моем случае мои объекты происходят из Java. Что я могу сделать?
Я также изучил gwt-exporter, и в нем показано, как создать экземпляр java-материала из javascript, но не как получить доступ к java-исходному материалу в javascript.
Я знаю, что это немного сбивает с толку, поэтому дайте мне знать, если у вас возникнут вопросы. Спасибо!