Целта ми е да инициирам 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.
Знам, че това е малко объркващо, така че, моля, уведомете ме, ако имате въпроси. Благодаря!