Могат ли 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