método remoto ilegal en java
-
09-10-2019 - |
Pregunta
Es la primera vez que el uso RMI de Java *. Tengo una clase personalizada que se extiende UnicastRemoteObject
e implementa una interfaz que se extiende a distancia. Creo que he aplicado los métodos de la interfaz correctamente en la clase, pero todavía me aparece un IllegalArgumentException
cuando trato de ejecutar el código (y se trata de un método que no tiene argumentos).
Las reclamaciones de JVM a haber encontrado un método remoto ilegal, pero el método y su aplicación parece bien a mí.
¿Hay alguna otra razón, como resultado de la cual podría producirse esta excepción a excepción de la aplicación o llamando al método erróneamente?
Aquí está el seguimiento de la pila:
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
Esta es la unión:
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();
}
Y aquí está el constructor de la clase:
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();
}
Solución
Todos los métodos en una interfaz Remote
RMI debe declarar RemoteException
en su cláusula throws
, por ejemplo:.
public String getId() throws RemoteException;
No está claro por qué los nombres de excepción getId()
específicamente, es probable que sólo el primer método que lo revisen.
Además, los métodos y getLeafNodes()
getNeighborhoodList()
debe tener tipos de retorno que especifican Node
, no NodeImpl
, de lo contrario, es probable que falle también.