2017-05-29 35 views
1

我目前正在尝试使用SyncProxy库来测试我的应用程序的服务,以便使用JMeter进行负载测试。该应用程序工作正常,我在本地主机上运行它。使用SyncProxy测试服务:“接收RPC响应时出现IOException”

问题出现在我尝试在我的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 = [email protected] 

我发现了很多的线程在谈论你的类需要实现“isSerializable”的事实,但我不明白,是我真的在本地主机上运行我的应用程序,并且一切正常,包括不同的服务。

但是,当涉及到运行我的JUnit(s),我有这些错误。

+1

检查基本知识:你的类是否实现了Serializable的'Theme'?它有没有参数的构造函数?你还使用什么gwt版本? – Andrei

+0

我的课'主题'是实现Serializable。它有一个无参数构造函数,gwt版本是2.6 – krakig

回答

0

看起来你弄乱了路径或类路径资源。 GWT-RPC使用一些生成的文件,称为策略来实现某种安全机制(即不允许某些类型等)。 就你而言,它看起来像在测试期间那些文件被放错了或者不在类路径中。

当发生这种情况时,我通常会通过RemoteServiceServlet#getSerializationPolicy进行调试(引用与GWT 2.8.1相关,而不是2.6,但我认为这部分没有多大变化)。 您最终会在RemoteServiceServlet#loadSerializationPolicy中尝试加载一些文件,并且您将能够看到它尝试这样做的路径以及为什么这些文件丢失。

+0

你是对的。我在那里添加了一个断点,当我测试来自我的应用程序的请求时,strongname等于类似于“E52F7D678A782A8A4B2A35A157692026”之类的内容,但是当我从我的JUnit尝试服务时,strongName为null,并且出现错误,被忽略。这些政策,我怎样才能从我的应用程序和我的测试中找到它们? – krakig

+0

我不认为这个强名称是空的是好的;你应该先检查一下,然后再担心这些文件。 正在从客户端的请求中读取强名称(请参阅ServerSerializationStreamReader.prepareToRead)。如果结果为null,那么你的客户端可能发送错误的请求,或者你的代理表现得很奇怪。检查并查看该强名称在哪里为空(可能是您的代理不允许或使用x-gwt-rpc内容类型对请求执行操作) – Andrei

+0

使用SyncProxy,发送到服务器端的以下标头为空:'X -GWT-Permutation'。然后,在'RemoteServiceServlet'中,'serializationpolicyFilePath'等于“/ector/null.gwt.rpc”,所以我必须找到为什么我的'strongname'为null。 – krakig

相关问题