我试图创建一个RMI工厂,但我一直收到以下错误:
java.lang.ClassCastException: com.sun.proxy.$Proxy0 cannot be cast to remote.pkg.ContractDataFactory
我之前从未使用过RMI协议,因此为了达到这个状态需要做很多猜测,但现在我完全不知道为什么$ Proxy0无法正确投射?
我所看到的所有阅读和其他示例都没有尝试通过工厂模式实现,所以我不确定这是我的问题所在?
应用程序的主要入口点:
public static void main(String[] args) throws Exception {
try {
LocateRegistry.createRegistry(1099);
Naming.rebind("FactoryTest", new ContractDataImpl(""));
} catch (RemoteException e) {
e.printStackTrace();
}
Thread a = new FactoryTest("A");
a.start();
Thread.sleep(1000);
Thread b = new FactoryTest("B");
b.start();
a.join();
b.join();
System.exit(0);
}
以下是我正在运行的FactoryTest类的run方法
public void run() {
try {
System.out.println("Getting a remote handle to a factory. " + this.hashCode());
ContractDataFactory factory = (ContractDataFactory) Naming.lookup("FactoryTest");
ContractDataRemote worker = factory.getClient();
} catch (Exception e) {
System.err.println(e);
e.printStackTrace();
}
}
这将创建一个ContractDataFactory实例,如下所示:
interface ContractDataFactory extends Remote {
public ContractDataRemote getClient() throws RemoteException;
}
和ContractDataRemote看起来像:
public interface ContractDataRemote extends Remote, DB {
}
DB只是另一个接口,具有完成工作所需的所有实际方法。
希望这是足够的信息来帮助我解决这个问题?
干杯。
编辑: 包含ContractDataFactoryImpl的内容
class ContractDataFactoryImpl extends UnicastRemoteObject implements ContractDataFactory {
private static final long serialVersionUID = 1337;
private static String dbLocation = null;
public ContractDataFactoryImpl(String dbLocation) throws RemoteException {
ContractDataFactoryImpl.dbLocation = dbLocation;
}
@Override
public ContractDataRemote getClient() throws RemoteException {
return new ContractDataImpl(dbLocation);
}
}
答案 0 :(得分:2)
Naming.rebind("FactoryTest", new ContractDataImpl(""));
那应该是
Naming.rebind("FactoryTest", new ContractDataFactoryImpl(""));