Просто чтобы все прояснить: вы можете выбросить как проверенные (расширяющие Exception
), так и не проверенные (расширяющие RuntimeException
) исключения с сервера на клиент - при условии, что исключение составляет , сериализуемое . Однако рекомендуется бросить проверенные исключения, так как они
представляет недопустимые условия в областях, находящихся вне непосредственного контроля над программой (недопустимый ввод данных пользователем, проблемы с базой данных, перебои в сети, отсутствующие файлы).
Напротив, непроверенные исключения
представляет дефекты в программе (ошибки) - часто недействительные аргументы, передаваемые в не приватный метод.
Источник
Как указано в документации , для отправки клиенту исключения должны быть выполнены следующие условия:
- Он должен расширяться
Exception
(обратите внимание, что RuntimeException
делает это).
- Он должен быть сериализуемым . Вкратце: внедрить
Serializable
, иметь конструктор без аргументов и иметь все поля, сериализуемые.
- В вашем интерфейсе
*Service
необходимо добавить объявление throws
в метод, который может вызвать исключение. Обратите внимание, что вам не нужно добавлять объявление throws
в интерфейс *Async
.
Как только вы это настроите, вы сможете обработать исключение в методе onFailure
в вашем AsyncCallback
.
Некоторый код для отображения всех частей вместе на основе примеров из руководства на сайте GWT :
* * DelistedException.java тысяча сорок-девять
public class DelistedException extends Exception implements Serializable {
private String symbol;
// Note the no-args constructor
// It can be protected so that only subclasses could use it
// (because if they want to be serializable too, they'll need
// a no-args constructor that calls the superclasses' no-args constructor...)
protected DelistedException() {
}
public DelistedException(String symbol) {
this.symbol = symbol;
}
public String getSymbol() {
return this.symbol;
}
}
StockPriceService.java
@RemoteServiceRelativePath("stockPrices")
public interface StockPriceService extends RemoteService {
StockPrice[] getPrices(String[] symbols) throws DelistedException;
}
StockPriceServiceAsync.java
public interface StockPriceServiceAsync {
void getPrices(String[] symbols, AsyncCallback<StockPrice[]> callback);
}
На стороне клиента
AsyncCallback<StockPrice[]> callback = new AsyncCallback<StockPrice[]>() {
public void onFailure(Throwable caught) {
if (caught instanceof DelistedException) {
// Do something with it
} else {
// Probably some unchecked exception,
// show some generic error message
}
public void onSuccess(StockPrice[] result) {
// Success!
}
};
stockPriceService.getPrices(symbols, callback);