web-dev-qa-db-ja.com

javaの不正なリモートメソッド

Java Rmi *を使用するのは初めてです。UnicastRemoteObjectを拡張し、リモートを拡張するインターフェースを実装するカスタムクラスがあります。メソッドを実装したと思いますクラスで正しくインターフェイスしますが、コードを実行しようとするとIllegalArgumentExceptionが返されます(引数のないメソッドに関するものです)。

Jvmは不正なリモートメソッドに遭遇したと主張していますが、メソッドとその実装は私には問題ないようです。

メソッドを誤って実装または呼び出す以外に、この例外が発生する可能性がある他の理由はありますか?


スタックトレースは次のとおりです。

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

インターフェースは次のとおりです。

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

そしてここにクラスのコンストラクタがあります:

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

RMI Remoteインターフェースのすべてのメソッドは、RemoteException節でthrowsを宣言する必要があります。例:

_public String getId() throws RemoteException;
_

例外の名前がgetId()である理由が明確ではありません。おそらく、これはおそらく最初にチェックしたメソッドにすぎません。

また、getLeafNodes()メソッドとgetNeighborhoodList()メソッドには、NodeではなくNodeImplを指定する戻り値の型が必要です。そうしないと、失敗する可能性があります。

82
skaffman