web-dev-qa-db-fra.com

Méthode distante illégale dans java

C'est la première fois que j'utilise Java Rmi *. J'ai une classe personnalisée qui étend UnicastRemoteObject et implémente une interface qui s'étend à distance. Je pense que j'ai implémenté les méthodes du interface correctement dans la classe mais j'obtiens toujours un IllegalArgumentException quand j'essaye d'exécuter mon code (et il s'agit d'une méthode qui n'a pas d'arguments).

Le jvm prétend avoir rencontré une méthode distante illégale mais la méthode et son implémentation me semblent correctes.

Y a-t-il une autre raison à la suite de laquelle cette exception peut se produire, sauf pour l'implémentation ou l'appel incorrect de la méthode?


Voici la trace de la pile:

SEVERE: null
Java.rmi.server.ExportException: remote object implements illegal remote interface; nested exception is:
        Java.lang.IllegalArgumentException: illegal remote method encountered: public abstract Java.lang.String Node.getId()
        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 Java.rmi.server.UnicastRemoteObject.<init>(Unknown Source)
        at Java.rmi.server.UnicastRemoteObject.<init>(Unknown Source)
        at NodeImpl.<init>(NodeImpl.Java:30)
        at NodeLauncher.main(NodeLauncher.Java:11)
Caused by: Java.lang.IllegalArgumentException: illegal remote method encountered: public abstract Java.lang.String Node.getId()
        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)
        ... 7 more

Voici l'interface:

import Java.rmi.*;
import Java.util.LinkedList;

interface Node extends Remote
{
    public boolean isAlive();

    public LinkedList<NodeImpl> getLeafNodes();

    public LinkedList<NodeImpl> getNeighborhoodList();

    public String [] getRoutingTable();

    public NodeImpl initiation(String credentials,Object application);

        public String route(String message,String key);

        public void inform(byte [] id);

        public String getId();

        public boolean isConnected();

        public void applicationClose();

        public boolean distanceMeasure();
}

et voici le constructeur de la classe:

public NodeImpl() throws RemoteException
    {
        super();
        l=4;
        M=1;
        nodeId=new byte [16];
        Random r=new Random();
        r.nextBytes(nodeId);
        leafNodes=new LinkedList<NodeImpl>();
        connected=false;
        ng=new NodeGUI(this);

        for(int i=0;i<l;i++)
        {
            leafNodes.add(null);
        }

        neighborhoodList=new LinkedList<NodeImpl>();
        anyNodeWhoAnswered=new LinkedList<byte []>();
        it=new InformingTimer(this);
        Thread informingTimerThread=new Thread(it);
        informingTimerThread.start();

        try 
        {
            Naming.rebind("rmi://" + "localhost" + ":1099/"+nodeId, this);
        }
        catch (Exception ex) 
        {
            Logger.getLogger(NodeImpl.class.getName()).log(Level.SEVERE, null, ex);
        }

        bootstrap();
    }
47
Range

Toutes les méthodes d'une interface RMI Remote doivent déclarer RemoteException dans leur clause throws, par exemple:

public String getId() throws RemoteException;

Il n'est pas clair pourquoi les noms d'exception getId() spécifiquement, c'est probablement juste la première méthode vérifiée.

De plus, les méthodes getLeafNodes() et getNeighborhoodList() doivent avoir des types de retour qui spécifient Node, pas NodeImpl, sinon elles échoueront probablement également.

82
skaffman