0

我编写了一个简单的客户端服务器架构,可以帮助我从 MS Office 文档中生成 PDF 文件。通信是通过 RMI 处理的,Spring 将整个复杂性包装在服务器端。

我不能在客户端使用 Spring,因为我从 Matlab 2007b 调用方法。由于 Matlab 中对静态和动态类路径的特殊处理,依赖于 spring 的 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;
}

从我的“前”弹簧配置(客户端)中提取:

<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”在创建简单的 RMI 应用程序时出错

spring 是否将我的接口封装在不同的接口中?有没有办法找出代理隐藏的接口?

如果您需要更多详细信息来澄清我的问题,请告诉我。

4

1 回答 1

1

如果远程服务没有实现,则RmiServiceExporter导出 a ,(即,不是传统的 RMI 服务器)RmiInvocationHandlerRemote

如果您不能RmiProxyFactoryBean在客户端使用 a ,这是一个用于将服务调用转换为 的服务接口代理的 bean 工厂,RemoteInvocations使用传统 RMI 似乎是更好的选择。

您也可以使用 RmiServiceExporter 导出传统的 RMI 服务,例如

public interface PDFCreationService extends Remote {
    public PDFCreationConfig createPDF(PDFCreationConfig config) throws RemoteException;
}
于 2013-03-20T22:39:25.790 回答