2016-05-29 7 views
0

Mein Projekt, das RMI verwendet, wird so aufgeteilt:RMI Registry und illegale Argument Exception

zwei Schnittstellen, ISportello und 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; 
} 

Zwei Klassen, die die Logik der Anwendung implementiert und implementiert die Schnittstellen: GestoreSportelliImplementazione und 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; 
} 

} 

Die zweite Klasse ist ein Stub (I, wenn weiter zu entwickeln, wenn ich weiß, werde warum das Programm funktioniert nicht wie es ist).

Zwei Klassen mit Hauptfunktionen, dass "wrap" den vorherigen zwei Klassen

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.printin (i.getmessage()); }

} 

} 

Ich betreibe die Klassen mit den wichtigsten in zwei differend Aufforderungsfenster, und eine dritte Eingabeaufforderung Fenster läuft das rmiregistry. Die SportelloServer-Klasse funktioniert nicht. Es läuft in eine Ausnahme:

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] 

Die # 19 Linie ist:

gestore.sottoscrivi(sportello); 
+0

Gibt es mehr der Stack-Trace? – EJP

+0

Nein, nichts. Ich weiß nicht, was ich falsch gemacht habe und es ist ein sehr einfacher Code. – EagleOne

+0

Wer hat die Quintessenz gedruckt? Derjenige, der gerade 'java.lang.ClassCastException @ ...' liest? Und sind all diese Klassen und Schnittstellen im selben Paket? – EJP

Antwort

0

Beide Schnittstellen Fernbedienung erweitern haben:

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

Ist der richtige ISportello Code