2013-03-20 38 views
0

我寫了一個簡單的客戶端服務器體系結構,可幫助我生成MS Office文檔以外的PDF文件。通信是通過RMI進行處理的,Spring將服務器端的整個複雜性包裹起來。RMI&Spring結束了客戶端上的ClassCastException

我不能在客戶端使用Spring,因爲我從Matlab 2007b調用方法。由於在Matlab中對靜態和動態類路徑進行了特殊處理,因此具有依賴關係的Jar會產生異常。

長話短說:我在普通的Java寫了一個簡單的RMI客戶端:

import com.whatever.PDFCreationService;  

Object service = Naming.lookup("rmi://operations:1099/pdfCreationService"); 
System.out.println((PDFCreationService)service); //produces ClassCastException 

接口:

public interface PDFCreationService { 
    public PDFCreationConfig createPDF(PDFCreationConfig config) throws IOException, InterruptedException, OperationInterruptionException; 
} 

中提煉出來的我的 「前任」 Spring配置(客戶端)的:

<bean id="pdfCreationService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean"> 
    <property name="serviceUrl" value="rmi://operations:1099/pdfCreationService"/> 
    <property name="serviceInterface" value="com.whatever.creator.PDFCreationService"/> 
</bean> 

和在服務器端:

<bean class="org.springframework.remoting.rmi.RmiServiceExporter"> 
    <property name="serviceName" value="pdfCreationService"/> 
    <property name="service" ref="pdfCreationService"/> 
    <property name="serviceInterface" value="com.whatever.creator.PDFCreationService"/> 
    <!-- defaults to 1099 --> 
    <property name="registryPort" value="1099"/> 
</bean> 

當我運行下面的異常被拋出代碼:

Exception in thread "main" java.lang.ClassCastException: $Proxy0 cannot be cast to com.whatever.creator.PDFCreationService 

我100%肯定,我不會嘗試轉換爲一類像這個帖子:"ClassCastException: $Proxy0 cannot be cast" error while creating simple RMI application

難道春天將我的界面封裝在不同的界面中?有沒有辦法找出代理隱藏的接口?

請讓我知道你是否需要更多的細節來澄清我的問題。

+0

如果是,拋出的異常* *從?堆棧跟蹤摘錄將會很好... – 2013-03-20 15:08:37

+0

您的遠程接口需要擴展Remote,以便開始使用。 – EJP 2013-03-20 21:27:26

回答

1

RmiServiceExporter導出一個RmiInvocationHandler如果遠程服務不實現Remote,(即不爲傳統的RMI服務器)

如果您不能使用在客戶端的一個RmiProxyFactoryBean,這是一個bean工廠的服務接口代理服務調用轉換爲RemoteInvocations,似乎更好的選擇,而不是使用傳統的RMI。

可以使用RmiServiceExporter出口土產RMI服務太像

public interface PDFCreationService extends Remote { 
    public PDFCreationConfig createPDF(PDFCreationConfig config) throws RemoteException; 
} 
+0

非常感謝您的寶貴意見。它解決了我的問題,通過消除客戶端的所有彈簧依賴關係。 (不知何故,如果不是所有相關的jar都分別添加到類路徑中,Matlab會感到困惑。) – Markus 2013-03-21 07:39:44