Можно ли получить доступ к объектам Java из Javascript в GWT?

Моя цель - инициировать вызовы 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.

Я знаю, что это немного сбивает с толку, поэтому дайте мне знать, если у вас возникнут вопросы. Спасибо!


person rjcarr    schedule 20.12.2013    source источник


Ответы (1)


С gwt-exporter это может быть ваш код:

// Create and export a closure used to wrap javascript callbacks
@ExportClosure
public static interface InteropCallback extends Exportable {
  void exec(String message);
}

// Make your Interop class exportable and export methods in it
@ExportPackage("foo")
@Export
public static class Interop implements Exportable {
  final static GreetingServiceAsync service = GWT.create(GreetingService.class);

  public static void greeting(String message, 
                              final InteropCallback success,
                              final InteropCallback error) {
    service.greetServer(message, new AsyncCallback<String>() {
      public void onFailure(Throwable caught) {
        error.exec(caught.getMessage());
      }
      public void onSuccess(String result) {
        success.exec(result);
      }
    });
  }
}

// In your onModuleLoad you have to make gwt-exporter export your stuff
@Override public void onModuleLoad() {
  ExporterUtil.exportAll();
  ...
}

Наконец, вызовите свои java-методы из рукописного javascript

window.foo.Interop.greeting("Hello", 
                            function(s){console.log(s)},
                            function(s){console.log(s)}
                            );
person Manolo Carrasco Moñino    schedule 26.12.2013
comment
Извините, что на ответ потребовалось время, но спасибо за отзыв! Мне кажется, что ваши примеры работают на меня и станут отличной отправной точкой. Я думаю, что я что-то неправильно истолковал и, возможно, даже не нужно использовать gwt-exporter, но приятно знать, что он есть, если мне это нужно. Спасибо! - person rjcarr; 07.01.2014