Problème avec RMI / Java

Fermé
Anji - Modifié par Anji le 18/05/2011 à 20:16
 Anji - 18 mai 2011 à 23:53
Bonjour,
.
Je suis actuellement entrain de développer une application utilisant un RMI et je coince sur une exception. Je ne comprends pas pourquoi.
.
Voici le principe de notre application : nous avons sur notre serveur un ensemble de fichier XML représentant des objets java serialisés (On les appelle Product). Lorsque nous lançons le serveur, il récupère tous ces objets et en dresse une liste comprise dans un autre objet java que nous appelons DataBase. Ensuite, via une IHM, l'utilisateur sélectionne un des Product de la DataBase et peut travailler dessus, en objet distant également (qui se met à jour via le patern observer si plusieurs utilisateurs travaillent dessus en même temps).
.
DataBase hérite de Remote et nous avons implémenté son squelette coté serveur. Nous n'avons aucun problème avec cet objet, on arrive à le récupérer depuis une autre JVM sans problème.
.
Le problème vient de la liste de Product qui est dans notre DataBase. Si nous n'en faisons pas des objet Remote, on peut les récupérer mais les modifications se font en local. Ce n'est pas ce que nous souhaitons (si deux utilisateurs travaillent sur le produit en même temps, les modifications de l'un doivent se répertorier chez l'autres). Nous avons donc mis en place le diagramme de classe suivant :
.
http://imageshack.us/m/233/624/proj2c.png
.
Mais celà ne marche pas.
.
Comme notre SkeletonProduct hérite d'Observable et ne peut donc pas hériter de UnicastRemoteObject, nous effectuons la ligne suivante sensé permettre de ne pas hériter de de UnicastRemoteObject :
.
UnicastRemoteObject.exportObject(SkeletonDataBase.getInstance(),this.port);
.
J'ai l'impression, mais j'espère me tromper, que Java ne veut pas qu'un objet Remote puisse hériter d'autre chose que de Remote en même temps. Ayant plusieurs classe devant hériter du "combo" Observable/Remote, il serait interessant de pouvoir garder l'interface Observable et sa classe abstraite en découlant.
.
Voici l'exception qui est lancée dès le lancement du Serveur :
.
java.rmi.server.ExportException: remote object implements illegal remote interface; nested exception is:
java.lang.IllegalArgumentException: illegal remote method encountered: public abstract void client.model.rmi.IObservable.addObserver(client.model.Observer)
at sun.rmi.server.UnicastServerRef.exportObject(Unknown Source)
at java.rmi.server.UnicastRemoteObject.exportObject(Unknown Source)
at java.rmi.server.UnicastRemoteObject.exportObject(Unknown Source)
at server.model.SoftwareServer.<init>(SoftwareServer.java:31)
at server.Server.main(Server.java:12)
Caused by: java.lang.IllegalArgumentException: illegal remote method encountered: public abstract void client.model.rmi.IObservable.addObserver(client.model.Observer)
at sun.rmi.server.Util.checkMethod(Unknown Source)
at sun.rmi.server.Util.getRemoteInterfaces(Unknown Source)
at sun.rmi.server.Util.getRemoteInterfaces(Unknown Source)
at sun.rmi.server.Util.createProxy(Unknown Source)
... 5 more
.
La ligne 31 de SoftwareServer.java étant la ligne que je vous ai mis un peu plus haut.
.
Merci d'avance.

A voir également:

1 réponse

Bon, j'ai trouvé un début de réponse : J'avais oublié les throws RemoteException dans l'interface IObservable.

J'ai pas eu le temps de tout débugger le reste mais ça devrait régler le problème principal.

Si jamais certains sont intéressé par ce problème ^^.
0