Рубрики
Java

GWT. Обработка серверных исключений на клиенте.

В целом обработка исключений при работе в GWT через RPC довольно детально описана в разделе документации DevGuideHandlingExceptions

Важный момент на который следуют обратить внимание — throws для метода.

Например, вот Ваш интерфейс:

public interface MyService extends RemoteService {
  public String myMethod(String s);
}

Допустим Вы сделали класс MyException который наследуется от RuntimeException. Например, это исключение вы создали для своих прикладных нужд и хотите чтобы оно могло быть перекинуто и обработано на клиенте.

Это конечно удобно, т.к. полученный тип исключений является Unchecked Exception. Таким образом его не нужно явно декларировать, оно может произойти где угодно (не надо прописывать везде throws) и такое исключение Вы не обязаны явно отлавливать. 

Другими словами,  мы же не пишем для каждого метода throws RuntimeException!

Тем не менее, если где-то у Вас в программе произойдет это исключение:

public class MyServiceImpl extends RemoteServiceServlet implements
    MyService {
 
  public String myMethod(String s) {
    // Do something interesting with 's' here on the server.
    if (isError() ) { throw new MyException("ups");  
    // 
    return s;
  }
}

То это исключение в методе onFailure(Throwable caught) будет передано просто как InvocationException, а не как MyException!
Дело в том, что если заглянуть в реализацию метода обработки вызова RPC-вызовов:

RemoteServiceServlet. processCall() → RPC.invokeAndEncodeResponse() → RPC.encodeResponseForFailure() → RPCServletUtils.isExpectedException()
мы найдем использование следующей конструкции:

Class< ?>[] exceptionsThrown = serviceIntfMethod.getExceptionTypes();

Другими словами, если Вы хотите чтобы Ваше исключение попадало в onFailure(Throwable caught) как MyException, то нужно обязательно декларировать throws, даже если Ваше исключение extends RuntimeException!

В нашем примере это будет выглядеть так:

public interface MyService extends RemoteService {
  public String myMethod(String s) throws MyException;
}

Вот такая вроде мелочь, но если ее не знать, могут возникнуть определенные неудобства.

Рубрики
3. Инструментарий

GWT 2.0 + GXT (Ext GWT) + Maven

1. GWT (Google Web Toolkit, произноситься: /’gwit/). На момент написания поста текущая версия  — 2.0.3.  Загрузить можно с официальной страницы GWT — http://code.google.com/intl/ru/webtoolkit/download.html.

Вкратце механизм работы GWT можно описать так.  Исходный код пишется на Java, затем он транслируется в JavaScript,  в результате получаются несколько версий программ для разных браузеров (Firefox, IE, Safari, Google Chrome, Opera 9.0). Полученный JavaScript код неплохо оптимизирован — название переменных и методов сокращенны, убраны комментарии и лишние пробелы. В итоге получается его естественная обфускация.  (Пример кусочка полученного кода: function Y7(a){W7();LE(a);a.Vb=NOc;return a} ).

После выхода версии  GWT 2.0 появилась возможность разбивать полученный JavaScript код (runAsync)  на отдельные файлы, которые затем загружаются асинхронно по мере надобности.  Так уменьшается размер первоначального скрипта и как следствие время загрузки и запуска приложения.

Подробное описание есть на официальном сайте GWT.

Рубрики
3. Инструментарий 4. Полезняшки

GWT+Maven

Связка Maven + GWT на мой взгляд один из самых эффективных  способов работы.

  1. Ставим maven. Как всегда, прописываем путь в PATH к mvn.bat
  2. Читаем про maven. Прочитать можно здесь тут .  Руководство на мой взгляд не особо удобное, но разобраться можно…
  3. Читаем про плагин к maven’у для работы с GWT. Читать здесь

Далее остается только создать соответствующий maven проект.

Можно руками, а можно например так:

mvn archetype:generate -DarchetypeGroupId=org.codehaus.mojo -DarchetypeArtifactId=gwt-maven-plugin -DarchetypeVersion=1.1 -DgroupId=myGroupId  -DartifactId=myArtifactId