# RMI ClassCastException



## Downlord (15. Jul 2009)

Hallo!

Habe eine typische Client/Server Applikation.

Das zu bindende Objekt:
(SourceForge.net Repository - [jgameadmin] View of /trunk/jGameAdmin/src/net/sourceforge/jgameadmin/agent/Agent.java)

```
public class Agent extends UnicastRemoteObject implements Remote {
  public Agent( int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf )
          throws RemoteException {
    super( port, csf, ssf );
  }
}
```

RMI Binding:
(SourceForge.net Repository - [jgameadmin] View of /trunk/jGameAdmin/WebContent/WEB-INF/src/net/sourceforge/jgameadmin/webinterface/JGameAdmin.java)

```
public class JGameAdminAgent {
  private void listen() throws IOException, NotBoundException {
    if ( System.getSecurityManager() == null ) {
      System.setSecurityManager( new RMISecurityManager() );
    }
    Registry registry = LocateRegistry.getRegistry( "localhost", REGISTRY_PORT,
            new SslRMIClientSocketFactory() );

    registry.rebind( AGENT_RMI_NAME, new Agent( cfg.getPort(), clientSocketFactory, serverSocketFactory ) );
  }
}
```

Der Client:
(SourceForge.net Repository - [jgameadmin] View of /trunk/jGameAdmin/WebContent/WEB-INF/src/net/sourceforge/jgameadmin/webinterface/Client.java)
[JAVA=76]public class Client {
  public Client( Host host ) throws RemoteException, NotBoundException {
    Registry registry = LocateRegistry.getRegistry( host.getAddress(), JGameAdminAgent.REGISTRY_PORT,
            new SslRMIClientSocketFactory() );
    agent = (Agent) registry.lookup( JGameAdminAgent.AGENT_RMI_NAME );
  }
}[/code]


Dann jedoch, schlägt der Cast fehl:

```
Caused by: java.lang.ClassCastException: $Proxy31 cannot be cast to net.sourceforge.jgameadmin.agent.Agent
	at net.sourceforge.jgameadmin.webinterface.Client.<init>(Client.java:80)
```

Als ich noch Naming.lookup() verwendete, hat es funktioniert. Wegen SSL hab' ich jedoch auf LocateRegistry.getRegistry().lookup() gewechselt. Ansonsten ist, glaube ich, alles noch gleich.

Irgendjemand eine Idee?


----------



## Downlord (16. Jul 2009)

Ich kapier' sie zwar nicht, jedoch habe ich die Lösung gefunden.

Es scheint, als könne nur zu einem Interface gecasted werden.


```
public interface Agent extends Remote {

}
```


```
public class AgentImpl extends UnicastRemoteObject implements Agent {
  public AgentImpl ( int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf )
          throws RemoteException {
    super( port, csf, ssf );
  }
}
```

So funktioniert's! Zwar wirft er für meine im Interface deklarierten Methoden noch Exceptions, doch das ist ein anderes Problem.


----------



## Downlord (16. Jul 2009)

Die anderen Exceptions wurden auch eliminiert; alle im Interface deklarierten Methoden müssen natürlich für RMI eine RemoteException werfen.


----------

