使用 SyncProxy 测试服务:“接收 RPC 响应时出现 IOException”

Posted

技术标签:

【中文标题】使用 SyncProxy 测试服务:“接收 RPC 响应时出现 IOException”【英文标题】:Using SyncProxy to test services : "IOException while receiving RPC response" 【发布时间】:2017-05-29 14:14:22 【问题描述】:

我目前正在尝试使用 SyncProxy 库来测试我的应用程序的服务,以便使用 JMeter 进行负载测试。该应用程序运行良好,我在 localhost 上运行它。

当我尝试在我的 JUnit 测试中使用 SyncProxy 时,问题出现了。

以下是 JUnit 测试中使用的一段代码:

 ThemeServiceAsync themeServiceAsync = (ThemeServiceAsync) SyncProxy
          .newProxyInstance(ThemeServiceAsync.class, MODULE_BASE_URL, GET_THEMES_SERVICE_NAME);

 themeServiceAsync.getListTheme(codeEfs, codeSI, noStr, statut, new AsyncCallback<List<Theme>> ()

    @Override
    public void onFailure(Throwable arg0) 
        // TODO Auto-generated method stub
        System.out.println(arg0);
    


    @Override
    public void onSuccess(List<Theme> result) 
        // TODO Auto-generated method stub
        System.out.println(result);

    

 );

我收到以下错误:IOException while receiving RPC response

我使用调试模式来查找问题出在哪里。在服务器端,一切正常,直到结果被发送回客户端。结果在数据库中找到了,但是我有一个神秘的500错误。

经过挖掘,发现抛出了这个异常(在AbstractRemoteServiceServlet):

com.google.gwt.user.client.rpc.SerializationException: Type 'net.gicm.ector.shared.beans.Theme' was not assignable to 'com.google.gwt.user.client.rpc.IsSerializable' and did not have a custom field serializer.
For security purposes, this type will not be serialized.: instance = net.gicm.ector.shared.beans.Theme@1b7cb71

我发现很多线程都在谈论您的类需要实现“isSerializable”这一事实,但我不明白的是,我实际上是在 localhost 上运行我的应用程序,并且一切正常,包括不同的服务。

但是在运行我的 JUnit 时,我遇到了这些错误。

【问题讨论】:

检查基础知识:您的班级Theme 是否实现了可序列化?它有无参数构造函数吗?还有你用的是什么gwt版本? 我的班级Theme 正在实现可序列化。它有一个无参数构造函数,gwt 版本是 2.6 【参考方案1】:

看起来您弄乱了路径或类路径资源。 GWT-RPC 使用一些生成的文件,称为策略来实现某种安全机制(即禁止某些类型等)。 在您的情况下,看起来在测试期间这些文件被放错地方或不在类路径中。

发生这种情况时,我通常通过RemoteServiceServlet#getSerializationPolicy 进行调试(参考GWT 2.8.1 而不是2.6,但我认为这部分并没有太大变化)。 您最终会到达RemoteServiceServlet#loadSerializationPolicy,它会尝试加载一些文件,并且您将能够看到它尝试在哪些路径上加载以及这些文件丢失的原因。

【讨论】:

你是对的。我在那里添加了一个断点,当我测试来自我的应用程序的请求时,strongname 等于“E52F7D678A782A8A4B2A35A157692026”之类的东西,但是当我从 JUnit 尝试服务时,strongName 为空,并且出现错误,被忽略。这些政策,我怎样才能从我的应用和测试中找到它们? 我不认为强名称为空是可以的;在担心文件之前,您应该先检查一下。正在从客户端的请求中读取强名称(请参阅ServerSerializationStreamReader.prepareToRead)。如果最终结果为 null,那么可能是您的客户端发送了错误的请求,或者您的代理行为异常。检查并查看该强名称在哪里作为 null 出现(也许您的代理不允许,或者对带有 x-gwt-rpc 内容类型的请求进行处理?) 使用 SyncProxy,发送到服务器端的以下标头为空:X-GWT-Permutation。然后,在RemoteServiceServlet中,serializationpolicyFilePath等于“/ector/null.gwt.rpc”,所以我要找出为什么我的strongname为null。 您的测试中可能存在一些用户代理问题?也许你用来模拟 RPC 客户端的任何东西都没有设置正确的用户代理(或任何),所以 GWT 并不真正知道要加载哪个排列? 其实我发现了这个:github.com/jcricket/gwt-syncproxy/issues/2。倒数第二条评论是我认为的问题

以上是关于使用 SyncProxy 测试服务:“接收 RPC 响应时出现 IOException”的主要内容,如果未能解决你的问题,请参考以下文章

gwt-syncproxy 无法连接到地址

无法让 gwt-syncproxy 工作

gwt-syncproxy - WebProject 和 Android 应用程序之间的 RPC

LoginUtils gwt-syncproxy

发送和接收 RPC 的函数名称?

GWT 和 Android 通信。枚举序列化问题