Wyjątek musi dziedziczyć po
Throwable (a więc na przykład Exception). Musi implementować java.io.Serializable oraz co najważniejsze musi implementować com.google.gwt.user.client.rpc.IsSerializable. Ta ostatnia klasa jest wymagana dla przekazywania wszelkich obiektów poprzez RPC, a więc dotyczy to również wyjątków.Wyjątek jest przechwytywany w metodzie
public void onFailure(Throwable caught) i zawarty jest w zmiennej caught. Dalszą obsługę wyjątku możemy robić już w standardowy sposób.Przykładowy kod:
Klasa błędu
import com.google.gwt.user.client.rpc.IsSerializable;
import java.io.Serializable;
public class MyException extends Exception
implements Serializable, IsSerializable {
String name = getClass().getName();
public String getName() {
return name;
}
}
Obsługa błedu
MyAppService.App.getInstance().method(new AsyncCallback<Void>() {
public void onFailure(Throwable caught) {
if (caught instanceof MyException)
handleException((MyException)caught);
else
handleUnknownException(caught);
}
public void onSuccess(Void result) {
[...]
}
});
Deklaracja metody w MyAppAsync
public interface MyAppAsync(){
void method(AsyncCallback<Void> async);
}
Niestety to rozwiązanie posiada dwa poważne problemy.
Po pierwsze pozwala na przesłanie tylko własnych klas błędów.
Po drugie wymaga aby klasa błędu była w pakiecie
client w module zawierającym kod GWT. Oznacza to poważny problem w zależnościach między modułami.Rozwiązanie drugiego problemu w skrócie:
Jest możliwa kompilacja modułu GWT przy pomocy kompilatora GWT (do postaci javascript), a następnie kompilacja źródeł z innym modułem. To może być na przykład moduł trzymający wszystkie obiekty. Istotne jest tylko, aby moduł GWT posiadał dostęp do tej skompilowanej klasy oraz klasa znajdowała się w odpowiednim pakiecie.
Ten konkretny problem postaram się opisać szerzej następnym razem.
Brak komentarzy:
Prześlij komentarz