Вместо того, чтобы создавать сотни различных сервисов GWT-RPC и классов serviceAsync, я пытаюсь создать единую службу с использованием дженериков. Вот интерфейс:Использование Generics с GWT-RPC не работает должным образом
@RemoteServiceRelativePath("dispatch")
public interface CommandService extends RemoteService
{
public <T> Result<T> execute(Command command, T target);
}
Здесь Command
является перечисление всех различных команд, которые я могу выдавать, например, Login, Register, ChangePassword
»и т.д. На стороне сервера, у меня есть HashMap
из Command
в качестве ключа, и класс Executor
в качестве значения. Для каждого Command
у меня есть соответствующий Executor
. Выполняется Executor
, а его возвращаемое значение возвращается на стороне сервера.
Проблема возникает, когда я пытаюсь создать на клиенте CommandServiceAsync
и попытаюсь выполнить его. Вот мой код, который:
public enum Command
{
LOGIN,
REGISTER,
CHANGE_PW;
public <T> void execute(T target, final ResultReceiver<T> receiver)
{
CommandServiceAsync command = GWT.create(CommandService.class);
command.execute(this, target, new AsyncCallback<Result<T> >()
{
@Override
public void onFailure(Throwable caught)
{
MyProgram.handleFailure(caught);
}
@Override
public void onSuccess(Result<T> result)
{
receiver.receive(result);;
}
});
}
}
Здесь Command.execute
является метод, который на самом деле вызывает службу. Вот как я звоню его выполнить LOGIN
команду:
LoginForm form = new LoginForm();
Command.LOGIN.execute(form, new ResultReceiver<LoginForm>()
{
@Override
public void receive(Result<LoginForm> result)
{
Console.debug("Received result");
//result.getTarget() will return an instance of LoginForm
Console.debug("user: " + result.getTarget().getUser());
Console.debug("pw: " + result.getTarget().getUser());
}
});
Проблема происходит на следующей строке в Command.execute
:
CommandServiceAsync command = GWT.create(CommandService.class);
Здесь я получаю следующие ошибки:
ERROR: Deferred binding failed for 'com.xxx.CommandService'; expect subsequent failures
ERROR: Uncaught exception escaped com.google.gwt.event.shared.UmbrellaException: Exception caught: Deferred binding failed for 'com.xxx.CommandService' (did you forget to inherit a required module?)
Caused by: com.google.gwt.core.ext.UnableToCompleteException: (see previous log entries)
Как я могу выполнить то, что я пытаюсь сделать?
Будьте очень осторожны с этим - вы явно говорит компилятору, что он может отправить * любой * сериализации объекта по проводам. Генератор RPC выберет любой Serializable, к которому имеет доступ GWT, и построит для него сериализаторы и десериализаторы и скомпилирует этот тип, даже если вы никогда не используете эти типы в другом месте проекта. –
Спасибо за ловушку @ColinAlworth – Jonathan