anon
anon

Reputation:

java.lang.ClassCastException: com.sun.proxy.$Proxy1 cannot be cast to

Server:

Registry registry = LocateRegistry.createRegistry(1099);

InventoryInterface Inventory = new Inventory(registry);

registry.bind("Inventory", Inventory);

Client:

Registry registry = LocateRegistry.getRegistry(1099);


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


String product_id = inventory.newProduct();

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

The Problem is the exception happens at the casting, in this case it happens at: ProductFacade product_1 = (ProductFacade) registry.lookup(product_id);

Exception:

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

Upvotes: 0

Views: 5220

Answers (2)

user207421
user207421

Reputation: 310840

Whatever is bound to the Registry under the name you're looking up does not implement the rmi.ProductFacade remote interface.

So I'm wondering if i should for example restart the Registry before casting again

Certainly not. (a) You can't restart it from the client, and (b) all you would get would be an empty Registry. The suggestion doesn't make sense.

Hard to see why InventoryInterface.newProduct() returns a String instead of the actual new ProductFacade object. Also why listAllProducts() returns a String rather than a String[]. I would redesign this without such heavy use of the Registry as follows:

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

Upvotes: 1

Arty Jiang
Arty Jiang

Reputation: 46

It can be about how you bind it. For example, if ProductFacade implements InventoryInterface you might need to cast it as InventoryInterface instead of ProductFacade.

Upvotes: 0

Related Questions