Es ist das erste Mal, dass ich Java Rmi *. Ich habe eine benutzerdefinierte Klasse, die UnicastRemoteObject
erweitert und implementiert eine Schnittstelle, die remote erweitert. Ich denke, dass ich die Methoden der Schnittstelle korrekt in der Klasse implementiert habe, aber immer noch bekomme ich eine IllegalArgumentException
, wenn ich versuche, meinen Code auszuführen (und es geht um eine Methode, die keine Argumente hat).Illegale Remote-Methode in Java
Die Jvm behauptet, eine illegale Remote-Methode gestoßen, aber das Verfahren und deren Umsetzung scheinen mir in Ordnung.
Gibt es einen anderen Grund als Folge davon diese Ausnahme mit Ausnahme für die Durchführung oder den Aufruf der Methode falsch auftreten könnte?
Hier ist der Stack-Trace:
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
Hier ist die Schnittstelle:
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();
}
und hier ist der Konstruktor der Klasse:
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();
}
Ich nehme an, Sie haben es geschafft, Ihre RMI-Registrierung zu verbinden und Ihr Remote-Objekt nachzuschlagen, nicht wahr? Können Sie Stacktrace (auf Client/Server) bereitstellen? – padis
Stacktrace und etwas Code könnte helfen, dies zu beantworten. – Joel
Die Ausnahme geschieht, bevor ich auch versuchen, die Fern object.It an der Linie geschieht des entfernten Objekts Konstruktor zu binden, wo ich UnicastRemoteObject Konstruktor mit Super() aufrufen. Ich habe gerade überprüft die api und sah, dass UnicastRemoteObject einen Konstruktor ohne Argumente hat so Ich verstehe nicht, was da nicht stimmt. – Range