2017-05-29 66 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

相關問題