46 votes

Méthode à distance illégale en java

C'est la première fois que j'utilise java rmi.J'ai une classe qui extends UnicastRemoteObject et implémente une interface qui s'étend à distance.Je pense que j'ai mis en œuvre les méthodes de l'interface correctement dans la classe, mais toujours je reçois une IllegalArgumentException lorsque j'essaie d'exécuter mon code (et c'est une méthode qui n'a pas d'arguments).La jvm affirme avoir rencontré un illégales à distance de la méthode, mais la méthode et de sa mise en œuvre semble bien pour moi.Est-il une autre raison à la suite de laquelle cette exception peut se produire à l'exception de la mise en œuvre ou l'appel de la méthode à tort?

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();
    }

85voto

skaffman Points 197885

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

 public String getId() throws RemoteException;
 

La raison pour laquelle l'exception nomme getId() précisément n'est probablement pas la seule méthode vérifiée.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X