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();
}
It's the first time I use java Rmi*. I have a custom class which extends UnicastRemoteObject
and implements an interface which extends remote. I think that I have implemented the methods of the interface correctly in the class but still I get an IllegalArgumentException
when I try to run my code (and it's about a method which has no arguments).
The jvm claims to have encountered an illegal remote method but the method and its implementation seem fine to me.
Is there any other reason as a result of which this exception might occur except for implementing or calling the method wrongly?
Here's the 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
Here's the 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();
}
and here's the constructor of the class:
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();
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
RMI
Remote
接口上的所有方法都必须在其throws
子句中声明RemoteException
,例如:不清楚为什么异常名称为
具体来说,getId()
它可能只是它检查的第一个方法。此外,
getLeafNodes()
和getNeighborhoodList()
方法的返回类型应指定Node
,而不是NodeImpl
,否则他们也可能会失败。All of the methods on a RMI
Remote
interface must declareRemoteException
in theirthrows
clause, e.g.:It's not clear why the exception names
getId()
specifically, it's probably just the first method it checked.Also, the
getLeafNodes()
andgetNeighborhoodList()
methods should have return types that specifyNode
, notNodeImpl
, otherwise they will likely fail also.