2013-03-05 113 views
0

我會盡量保持這篇文章儘可能小,所以我會添加更多的信息和代碼,如果請求。編碼RMI客戶端回調從服務器編碼 - UnmarshalException ClassNotFoundException

場景:我正在編寫一個服務器/客戶端應用程序來跟蹤我們公司的一些流程,因此用戶將創建小標籤,該標籤將從一個用戶的屏幕切換到另一個用戶(根據Swing編寫的客戶端)流程。

我正在運行本地Glasfish 3.1服務器(在Eclipse中)和MySql。在服務器上,我運行Spring MVC和Spring Data + Hibernate。

的屬性文件保存這些信息,便於變化:

rmi.serverPort = 1971 
rmi.clientPort = 2010 

在服務器啓動時還有那臺RMI環境這樣一個bean:

@Autowired 
    private RmiData rmiData; 
    @Autowired 
    private DataRequestHandler dataRequestHandler; 
    @Autowired 
    private ConnectionRequestHandler connectionRequestHandler; 
    . 
    . 
    . 

    LocateRegistry.createRegistry(rmiData.getServerPort()); 
    String rmiUrl = "rmi://" + rmiData.getHost() + ":" + rmiData.getServerPort() + "/"; 
    Naming.rebind(rmiUrl + "ConnectionRequestHandler", connectionRequestHandler); 
    Naming.rebind(rmiUrl + "DataRequestHandler", dataRequestHandler); 

服務器包含的接口並且處理程序和客戶端的實現都只有接口。

這是沒有SecurityManager和沒有政策文件。儘管我必須將Hibernate jar包含到客戶端來解決其他異常(SO中的解決方案)。

使客戶端連接到服務器並請求數據工作後,我開始將回調編碼到客戶端(服務器也必須將數據推送到客戶端)。所以這就是我現在被卡住的地方。

這裏是我想提出的回調(客戶端的行爲像一個服務器):

private ClientCallbackHandler clientCallbackHandler = new ClientCallbackHandlerImpl(); 
    . 
    . 
    . 

    LocateRegistry.createRegistry(rmiData.getClientPort()); 
    String rmiUrl = "rmi://localhost:" + rmiData.getClientPort() + "/"; 
    Naming.rebind(rmiUrl + "ClientCallbackHandler", clientCallbackHandler); 

服務器只包含客戶端界面和客戶既有接口和實現的處理程序。

因此,當服務器執行

String rmiUrl = "rmi://" + clientHost + ":" + clientPort + "/"; 
    clientCallbackHandler = (ClientCallbackHandler)Naming.lookup(rmiUrl + "ClientCallbackHandler"); 

我得到下面的異常在服務器上:

SEVERE: java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
java.lang.ClassNotFoundException: br.com.affair.socontrol.rmi.ClientCallbackHandlerImpl (no security manager: RMI class loader disabled) 

我避免在安裝安全管理器和策略文件(也試過了,沒有成功),我堅持在這裏。

我不明白爲什麼服務器一旦所需要的是接口就會抱怨實現類。任何幫助深表感謝。謝謝。

回答

1

經過幾個小時的努力,我終於找到了問題。

的ClientCallbackHandlerImpl類沒有延長的UnicastRemoteObject。之後,代碼運行順利。謝謝你閱讀這篇文章並思考一些事情。 PS:我知道它看起來像一個noob的錯,但我避免做代碼複製/粘貼。

+0

道德:不要複製/粘貼。瞭解你在做什麼。 – EJP 2013-03-06 19:54:55

+0

其實我只在幾個案例中複製/粘貼我自己的代碼,沒有人可以通過複製別人的代碼來處理rmi。我明白我在做什麼,但是這個課程擴展跳過了我的眼睛。我在這裏最大的問題實際上是不從其他類的代碼複製。感謝您的光臨。 – 2013-03-07 00:21:39

+0

爲了完整起見,您也可以在構造函數中調用'UnicastRemoteObject.exportObject()',而不是擴展'UnicastRemoteObject()'。 – EJP 2013-03-07 06:46:17

相關問題