Java 使用SyncProxy测试服务:“;接收RPC响应时发生IOException“;

Java 使用SyncProxy测试服务:“;接收RPC响应时发生IOException“;,java,serialization,gwt,gwt-syncproxy,Java,Serialization,Gwt,Gwt Syncproxy,我目前正在尝试使用SyncProxy库来测试我的应用程序的服务,以便使用JMeter进行负载测试。该应用程序运行良好,我正在本地主机上运行它 当我尝试在JUnit测试中使用SyncProxy时,问题出现了,它们失败了 以下是JUnit测试中使用的一段代码: ThemeServiceAsync themeServiceAsync = (ThemeServiceAsync) SyncProxy .newProxyInstance(ThemeServiceAsync.class,

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

当我尝试在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);

    }

 });
我发现很多帖子都在谈论你的类需要实现“isSerializable”,但我不明白的是,我实际上是在localhost上运行我的应用程序,而且一切正常,包括不同的服务


但在运行JUnit时,我会犯这些错误

看起来你把路径或类路径资源搞砸了。 GWT-RPC使用一些生成的文件(称为策略)来实现某种安全机制(即不允许某些类型,等等)。 在您的情况下,在测试过程中,这些文件似乎放错位置或不在类路径上

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

看起来您将路径或类路径资源搞乱了。 GWT-RPC使用一些生成的文件(称为策略)来实现某种安全机制(即不允许某些类型,等等)。 在您的情况下,在测试过程中,这些文件似乎放错位置或不在类路径上

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

检查基本知识:您的类
主题
实现可序列化吗?它是否有无参数构造函数?还有,您使用的是什么gwt版本?我的类
主题
正在实现可序列化。它有一个无参数构造函数,gwt版本是2.6Check basics:您的类
主题
实现可序列化吗?它是否有无参数构造函数?还有,您使用的是什么gwt版本?我的类
主题
正在实现可序列化。它有一个无参数构造函数,gwt版本是2.6You是对的。我在其中添加了一个断点,当我测试我的应用程序的请求时,strong名称等于“E52F7D678A782A8A4B2A35A157692026”,但当我从JUnit尝试服务时,strong名称为空,并且有一个错误被忽略。那些策略,我如何从我的应用程序和测试中找到它们呢?我不认为强名称为null是可以的;在担心文件之前,您应该先检查一下。正在从客户端的请求中读取强名称(请参阅
ServerSerializationStreamReader.prepareToRead
)。如果结果为null,则可能是您的客户端发送了错误的请求,或者您的代理行为异常。检查并查看强名称在何处为空(可能是您的代理不允许,或者对具有x-gwt-rpc内容类型的请求执行操作?)。使用SyncProxy,发送到服务器端的以下标头为空:
x-gwt-Permutation
。然后,在
RemoteServiceServlet
中,
serializationpolicyFilePath
等于“/ector/null.gwt.rpc”,因此我必须找出为什么我的
strongname
为null。也许您的测试中出现了一些用户代理问题?也许无论您使用什么来模拟RPC客户端,都没有设置正确的用户代理(或任何用户代理),因此GWT不知道要加载哪个排列?实际上我发现了这个:。最后一点是我的问题,我相信你是对的。我在其中添加了一个断点,当我测试我的应用程序的请求时,strong名称等于“E52F7D678A782A8A4B2A35A157692026”,但当我从JUnit尝试服务时,strong名称为空,并且有一个错误被忽略。那些策略,我如何从我的应用程序和测试中找到它们呢?我不认为强名称为null是可以的;在担心文件之前,您应该先检查一下。正在从客户端的请求中读取强名称(请参阅
ServerSerializationStreamReader.prepareToRead
)。如果结果为null,则可能是您的客户端发送了错误的请求,或者您的代理行为异常。检查并查看强名称在何处为空(可能是您的代理不允许,或者对具有x-gwt-rpc内容类型的请求执行操作?)。使用SyncProxy,发送到服务器端的以下标头为空:
x-gwt-Permutation
。然后,在
RemoteServiceServlet
中,
serializationpolicyFilePath
等于“/ector/null.gwt.rpc”,因此我必须找出为什么我的
strongname
为null。也许您的测试中出现了一些用户代理问题?也许无论您使用什么来模拟RPC客户端,都没有设置正确的用户代理(或任何用户代理),因此GWT不知道要加载哪个排列?实际上我发现了这个:。第二个到最后一个评论是我认为存在的问题
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