# RMI - $Proxy0 cannot be cast to - Trennung von Client/Server



## Guest (15. Mai 2008)

Hallo,
folgende Symptomatik.
Wir, in der Uni sollen ne RMI Bankanwendung schreiben. Geht auch alles soweit. Nur das ich leider feststellen musste, dass die Änderung auf der Client Seite nie wirklich beim Server ankommen. Also 10h angestrengt auf den Bildschirm gestarrt und dann an die "Insel gewendet". 

In unserem Beispiel greift der Client auf die Interfaces zu die im Server Package liegen. Dachte mir das kann doch nicht sein, wenn dann sollte doch maximal die Schnittstelle bekannt geschweige denn das der Client gleich im Server Package rumfingert. Also hab ich mal versucht das Insel Beispiel nachzuschreiben.

Folgende Struktur:
Package Server->Main
Package Server->Server
Package Server->AddImpl
Package Server->Adder (Interface)

Package Client->Main
Package Client->Client


An der Stelle meckert die IDE natürlich da im Package Client sich kein Interface Adder befindet, dieser Brückenschlag ist in der "Insel" irgendwie untergegangen, in unserem Lehrbeispiel gab es dann ein import auf das Server Package.
Nun aber in Normalfall sind ja Server und Client nicht im selben Projekt. Es sollte ja nur die Schnittstelle Adder bekannt sein. Nur die allein macht nicht mit, zumindest nicht wenn man sie einfach in das Client Package kopiert.


```
Registry registry = LocateRegistry.getRegistry(); 
Adder adder = (Adder) registry.lookup( "Adder" ); 
System.out.println( adder.add( 47, 11 ) );
```

//Das ist jetzt meine Eigenkreation, da ja dem Client das Interface Adder bekannt sein sollte ?!
Package Client->Adder (Interface hier ist wahrscheinlich der Haken)

//daraus resultiert dann folgende Fehlermeldung
Der Fehler lautet:
java.lang.ClassCastException: $Proxy0 cannot be cast to client.Adder

Könnt ihr mir helfen.
Grüsse Conrad


----------



## Guest (16. Mai 2008)

Nix kopieren, das Interface vom Server wiederverwenden. Einfach die Interfaces in eine Jar-Datei verpacken
und diese Jar-Datei wiederverwenden. Oder vergiss zuerst mal die RMI Schicht und mach das so, wie du es 
machen würdest, wenn kein "Netzwerk" dazwischen wäre. Darauf aufbauend kann man dann alles in einem
kleinen Refactoring auf RMI umstellen. Achte nur darauf, dass du überall gegen Interfaces programmierst und
die Implementierung über Factories erstellst, dann wird es später einfacher.


----------

