我試圖用泛型創建一個單一的服務,而不是創建一百個不同的GWT-RPC服務和serviceAsync類。這裏的接口:在GWT-RPC中使用泛型沒有像預期的那樣工作
@RemoteServiceRelativePath("dispatch")
public interface CommandService extends RemoteService
{
public <T> Result<T> execute(Command command, T target);
}
這裏Command
是一切,我可以發出不同的命令,如Login, Register, ChangePassword
的枚舉」等在服務器端,我有Command
的關鍵一HashMap
,和一個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生成器將挑選出GWT可以訪問的任何Serializable,並且將爲它構建序列化器和反序列化器並編譯類型,即使您從未在項目的其他地方使用這些類型。 –
感謝您的支持@ColinAlworth – Jonathan