2016-05-29 5 views
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); 
+0

がありますされていますより多くのスタックトレース? – EJP

+0

いいえ、何もありません。私は何が間違っていたのか分かりません。それはとても簡単なコードです。 – EagleOne

+0

誰がその最終行を印刷しましたか? 'java.lang.ClassCastException @ ...'だけを読み取るものはありますか?これらのクラスとインターフェイスはすべて同じパッケージに入っていますか? – EJP

答えて

0

両方のインターフェイスがリモート拡張する必要があります:

public interface ISportello extends Remote{ 
public boolean serviRichiesta(int id) throws RemoteException; 
} 

正しいISportelloコード

関連する問題