Java RMI Factory - ClassCastException

时间:2014-11-16 21:58:41

标签: java rmi factory

我试图创建一个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);
}
}

1 个答案:

答案 0 :(得分:2)

Naming.rebind("FactoryTest", new ContractDataImpl(""));

那应该是

Naming.rebind("FactoryTest", new ContractDataFactoryImpl(""));