RMI ClassCastException

Status
Nicht offen für weitere Antworten.

Downlord

Mitglied
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)
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)
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:
Code:
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

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

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

Java:
public interface Agent extends Remote {

}

Java:
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.
 
Zuletzt bearbeitet:

Downlord

Mitglied
Die anderen Exceptions wurden auch eliminiert; alle im Interface deklarierten Methoden müssen natürlich für RMI eine RemoteException werfen. :)
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben