无法让 gwt-syncproxy 工作
Posted
技术标签:
【中文标题】无法让 gwt-syncproxy 工作【英文标题】:Unable to get gwt-syncproxy working 【发布时间】:2015-02-16 22:28:14 【问题描述】:我正在尝试获取一个非常简单的 gwt-syncproxy 示例以在 Eclipse 开发人员模式下工作。我创建了示例 GWT/GAE 项目并将其命名为“testgwtrpc”。我验证这可以发送问候语并接收服务器的响应。我创建了以下独立 Java 程序来调用 GWT RPC。
SyncProxy.setBaseURL("http://127.0.0.1:8888/testgwtrpc/");
GreetingServiceAsync greetingServiceAsync = SyncProxy.create(GreetingService.class);
greetingServiceAsync.greetServer("Hello", new AsyncCallback<String>()
@Override
public void onFailure(Throwable caught)
@Override
public void onSuccess(String result)
System.out.println("From server: " +result);
);
我从SyncProxy.setBaseURL()
得到以下异常:
INFO: No RemoteService in the classpath
Feb 16, 2015 5:10:19 PM com.gdevelop.gwt.syncrpc.SyncProxy populatePolicyMap
INFO: Populating Policy Map
Exception in thread "main" com.gdevelop.gwt.syncrpc.exception.SyncProxyException: Error POLICY_NAME_POPULATION. Unable to populate policy names, see below exception.
at com.gdevelop.gwt.syncrpc.SyncProxy.populatePolicyMap(SyncProxy.java:515)
at com.gdevelop.gwt.syncrpc.SyncProxy.setBaseURL(SyncProxy.java:532)
at com.ptflix.utilities.CallGwtRpc.main(CallGwtRpc.java:12)
Caused by: java.io.FileNotFoundException: http://127.0.0.1:8888/testgwtrpc/compilation-mappings.txt
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1835)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1440)
at com.gdevelop.gwt.syncrpc.RpcPolicyFinder.getResposeText(RpcPolicyFinder.java:201)
at com.gdevelop.gwt.syncrpc.RpcPolicyFinder.fetcherSerializationPolicyNameJS(RpcPolicyFinder.java:68)
at com.gdevelop.gwt.syncrpc.RpcPolicyFinder.fetchSerializationPolicyName(RpcPolicyFinder.java:180)
at com.gdevelop.gwt.syncrpc.SyncProxy.populatePolicyMap(SyncProxy.java:513)
... 2 more
看起来这应该很简单,但是,唉,它不起作用。
任何想法为什么?非常感谢您的帮助。
【问题讨论】:
【参考方案1】:检查这个link
无法找到 RPC 策略文件 GWT-编译您的网络应用程序,请确保 您的服务正在您期望的位置运行(部署与本地 测试网址),如果使用 GAE,请确保更改您的 appengine-web.xml 如 android#Setup_in_Eclipse 部分所述。 本质上,您需要确保 .gwt.rpc 文件是 可从“远程”Android 客户端访问。
【讨论】:
【参考方案2】:确保您已执行 GWT 编译(IE 右键单击您的 testgwtrpc 项目,Google->GWT-Compile
)。 Eclipse 和开发模式中的测试不需要这些文件,因为它由 GWT 的托管服务器系统处理。但是 Standalone 和 Android 系统是分开的,因此需要访问 GWT 编译创建的文件。
【讨论】:
【参考方案3】:@JCricket 和@Ahmed El-Fayomy 的综合答案提供了我需要的信息来完成这项工作。非常感谢你们俩。我决定把你的答案合并一下,以便给下一个有同样问题的人一个更完整、更清晰的答案。
正如 JCricket 所说,您必须进行 GWT 编译,因为 gwt-syncproxy 会从 App Engine 应用程序下载多个文件,包括 compilation-mappings.txt 和 *.gwt.rpc 文件。 GWT 编译生成这些文件。但是,您会发现通过 gwt-syncproxy 的 RPC 调用仍然失败,除非您指定 app-engine 以允许客户端下载 *.gwt.rpc 文件。这是按照 Ahmed here 给出的链接中所述完成的。具体来说,在 appengine-web.xml 的“静态文件”部分中,更改:
<exclude path="**.gwt.rpc" /> to <include path="**.gwt.rpc" />
还有一件事:
从您的客户端应用程序调用 SyncProxy.setBaseURL() 时,我使用了以下 URL:
http://127.0.0.1:8888/testgwtrpc/
其中“testgwtrpc”是模块名称,在我的 .gwt.xml 文件中重命名。
我还没有在生产模式下尝试过,只有开发模式。
【讨论】:
我面临同样的问题,但项目是简单的 GWT 项目,所以我没有 *.xml 文件包含这样的行我有两个项目,一个遇到了这个问题。 那是因为 SyncProxy 无法从您的站点下载以下文件:
compilation-mappings.txt
*.nocache.js
*.cache.html
*.gwt.rpc
【讨论】:
以上是关于无法让 gwt-syncproxy 工作的主要内容,如果未能解决你的问题,请参考以下文章
gwt-syncproxy - WebProject 和 Android 应用程序之间的 RPC