从Java调用GWT RPC服务,RPC策略出现问题

时间:2013-11-12 01:09:27

标签: java http gwt serialization gwt-rpc

我需要从简单的Java代码调用GWT RPC服务。是的,我读了这个

Invoke a GWT RPC service from Java directly

但是,我的问题是我无法访问Web应用程序代码(虽然我可以询问并获取它的某些部分),所以我不能将它添加到我的Java项目的构建路径中。我从互联网上读到的所有信息都不清楚究竟需要导入什么。 问题是:为了调用服务工作,我应该在项目中包含哪些最小值(例如使用syncproxy gwt)?是否足以在我的代码中重新定义客户端接口,或者我是否应该进行一些编译工作?

编辑:我已在本地使用在localhost上运行的默认Web应用程序进行了一些测试。我创建了一个新的java项目,导入了同步和异步服务接口以及我在Web应用程序的WAR文件夹中找到的RPC序列化策略。这是我的测试代码

import com.gdevelop.gwt.syncrpc.SyncProxy;

public class serviceCall {

private static final String MODULE_BASE_URL = "http://127.0.0.1:8888/gwttestapp/";
private static final String SERVICE_NAME = "greet";

public static void main(String[] args) {

     GreetingService rpcService = (GreetingService) SyncProxy.newProxyInstance(GreetingService.class, MODULE_BASE_URL, SERVICE_NAME, "CB32CC2E454EE7E1088B2E29CEB44F84");
     String result = rpcService.greetServer("SyncProxy");
}
}

然而,服务器似乎无法识别RPC策略,因为我得到以下异常:

Exception in thread "main" com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException: This application is out of date, please click the refresh button on your browser. ( Blocked attempt to access interface 'GreetingService', which is not implemented by 'com.apptesting.server.GreetingServiceImpl'; this is either misconfiguration or a hack attempt )
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at com.gdevelop.gwt.syncrpc.SyncClientSerializationStreamReader.instantiate(SyncClientSerializationStreamReader.java:746)
at com.gdevelop.gwt.syncrpc.SyncClientSerializationStreamReader.deserialize(SyncClientSerializationStreamReader.java:816)
at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamReader.readObject(AbstractSerializationStreamReader.java:119)
at com.gdevelop.gwt.syncrpc.RemoteServiceSyncProxy.doInvoke(RemoteServiceSyncProxy.java:204)
at com.gdevelop.gwt.syncrpc.RemoteServiceInvocationHandler.invoke(RemoteServiceInvocationHandler.java:193)
at com.sun.proxy.$Proxy0.greetServer(Unknown Source)
at serviceCall.main(serviceCall.java:11)

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

尝试在未指定.gwt.rpc策略的情况下启动rpcService。 IE,只需拨打电话:

GreetingService rpcService = (GreetingService) SyncProxy.newProxyInstance(GreetingService.class, MODULE_BASE_URL, SERVICE_NAME);

您通常不需要指定确切的序列化策略,因为RPC系统应自动识别它。实际上,最好不要指定它,因为部署的站点将在后端更改时更改序列化策略文件。查看源代码并测试wiki(https://code.google.com/p/gwt-syncproxy/wiki/SourceAndTesting),获取有关设置需求的一些指导。 Android测试应用程序的源代码可以为您提供有关创建功能独立的代码指南(如果您忽略AsyncCallback实现)

一般来说,回答您的问题,出于部署目的,您实际上只是您指定的接口(* Service& * ServiceAsync)。为了在开发环境中进行测试,您可以模拟一些* Impl文件,这些文件将为您提供一些通用的测试响应(例如在默认的Web应用程序中)。在设置部分查看同步代理项目(https://code.google.com/p/gwt-syncproxy/wiki/Android)中的Android Wiki,以快速了解链接所需文件的情况。

免责声明:我是Android syncproxy库的开发者