0
私のプロジェクトは、その分割されています。RMIレジストリおよびRMIを使用して不正な引数例外
二つのインターフェース、ISportelloとIGestoreSportelliを。アプリケーションのロジックを実装し、インタフェースを実装
public interface IGestoreSportelli extends Remote {
public boolean sottoponiRichiesta (int id) throws RemoteException;
public void sottoscrivi (ISportello sportello) throws RemoteException;
}
public interface ISportello {
public boolean serviRichiesta(int id) throws RemoteException;
}
2つのクラス:私はなぜ知っているだろうときに、第2のクラスはスタブでGestoreSportelliImplementazioneとSportelloImplementazione
public class GestoreSportelliImplementazione implements IGestoreSportelli{
public Vector<ISportello> sportelli = new Vector<ISportello>();
@Override
public boolean sottoponiRichiesta(int id) throws RemoteException {
System.out.println("Processo la richiesta: id:" + id);
int size = sportelli.size();
int i=0;
boolean esito = false;
do {
esito = sportelli.get(i++).serviRichiesta(id);
}while(i<size && !esito);
return esito;
}
@Override
public void sottoscrivi(ISportello sportello) throws RemoteException {
System.out.println("[GESTORE] Aggiungo un nuovo sportello");
System.out.println("SPORTELLO: " + sportello);
sportelli.add(sportello);
}
}
@SuppressWarnings("serial")
public class SportelloImplementazione extends UnicastRemoteObject implements ISportello{
protected SportelloImplementazione() throws RemoteException {
super();
}
@Override
public boolean serviRichiesta(int id) throws RemoteException {
// TODO Auto-generated method stub
return true;
}
}
は(私があれば、さらに発展しますプログラムはそのまま動作しません)。
"ラップ" 前の二つのクラスというの主な機能を持つ2つのクラス
public class GestoreSportelliServer {
public static void main(String[] args) {
try {
IGestoreSportelli gestore = new GestoreSportelliImplementazione();
Registry rmi = LocateRegistry.getRegistry();
IGestoreSportelli gestoreRef = (IGestoreSportelli) UnicastRemoteObject.exportObject(gestore,0);
System.out.println("[GESTORE] AVVIATO");
System.out.println("[GESTORE] " + gestore);
rmi.rebind("gestore", gestoreRef);
System.out.println("[GESTORE] Registrato");
}
catch (RemoteException r)
{
r.printStackTrace();
}
}
}
public class SportelloServer {
public static void main(String[] args) {
try {
Registry rmi = LocateRegistry.getRegistry();
ISportello sportello = new SportelloImplementazione();
System.out.println("[SPORTELLO] : " + sportello);
IGestoreSportelli gestore =(IGestoreSportelli) rmi.lookup("gestore");
gestore.sottoscrivi(sportello);
System.out.println("[SPORTELLO] Sottoscrizione avvenuta");
}
catch (RemoteException r)
{
r.printStackTrace();
}
catch (NotBoundException n)
{
n.printStackTrace();
}
catch (IllegalArgumentException i)
{
i.printStackTrace();
のSystem.out.println(i.getmessage()); }
}
}
私は2つのdifferendプロンプトのウィンドウでメインを持つクラスを実行し、そして第三プロンプトウィンドウがするrmiregistryを実行します。 SportelloServerクラスは動作しません。例外にそれを実行します:
java.lang.IllegalArgumentException: [email protected]
at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
at sun.rmi.transport.Transport$1.run(Unknown Source)
at sun.rmi.transport.Transport$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source)
at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
at sun.rmi.server.UnicastRef.invoke(Unknown Source)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source)
at com.sun.proxy.$Proxy1.sottoscrivi(Unknown Source)
at server.SportelloServer.main(SportelloServer.java:19)
[email protected]
#19行は次のとおりです。
gestore.sottoscrivi(sportello);
がありますされていますより多くのスタックトレース? – EJP
いいえ、何もありません。私は何が間違っていたのか分かりません。それはとても簡単なコードです。 – EagleOne
誰がその最終行を印刷しましたか? 'java.lang.ClassCastException @ ...'だけを読み取るものはありますか?これらのクラスとインターフェイスはすべて同じパッケージに入っていますか? – EJP