1

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

直接从 Java 调用 GWT RPC 服务

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

编辑:我已经使用在本地主机上运行的默认 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)

有人可以帮忙吗?

4

1 回答 1

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 库的开发人员

于 2013-11-26T13:11:13.797 回答