服务器:

Registry registry = LocateRegistry.createRegistry(1099);

InventoryInterface Inventory = new Inventory(registry);

registry.bind("Inventory", Inventory);


客户:

Registry registry = LocateRegistry.getRegistry(1099);


InventoryInterface inventory = (InventoryInterface) registry.lookup("Inventory");


String product_id = inventory.newProduct();

ProductFacade product_1 = (ProductFacade) registry.lookup(product_id);


问题是强制转换发生在例外情况下,在这种情况下,它发生在:ProductFacade product_1 = (ProductFacade) registry.lookup(product_id);

例外:

Exception in thread "main" java.lang.ClassCastException: com.sun.proxy.$Proxy2 cannot be cast to rmi.ProductFacade

最佳答案

以您要查找的名称绑定到注册表的任何内容都不会实现rmi.ProductFacade远程接口。


所以我想知道我是否应该例如在重新投射之前重新启动注册表


当然不是。 (a)您无法从客户端重新启动它,并且(b)您将得到的只是一个空注册表。该建议没有任何意义。

很难理解为什么InventoryInterface.newProduct()返回一个String而不是实际的新ProductFacade对象。也是为什么listAllProducts()返回String而不是String[]的原因。我将在不大量使用注册表的情况下重新设计它,如下所示:

public interface InventoryInterface extends Remote {
    public ProductFacade newProduct() throws RemoteException;
    public ProductFacade getProduct(String id) throws RemoteException;
    public String[] listAllProducts() throws RemoteException;
}

07-24 15:31