JPanel über RMI übertragen funktioniert nicht

AAF

Grünschnabel
Möchte JPanel über RMI übertragen. Jedoch folgt dann die Fehlermeldung:
java.lang.ClassNotFoundException: panels.LoginPage (no security manager: RMI class loader disabled)

Hier mein Versuch:

Interface:
Code:
public interface Manager extends Remote {
    JPanel getLoginPage() throws RemoteException;
    int getZahl() throws RemoteException;
    String getText(String text) throws RemoteException;
}

Implementierung:
Code:
public class ManagerImpl implements Manager {
    public ManagerImpl() throws RemoteException {
    }
    
    public JPanel getLoginPage() throws RemoteException {
        LoginPage lp = new LoginPage();
        
        return lp;
    }

    public int getZahl() throws RemoteException {
        return 1337;
    }

    public String getText(String text) throws RemoteException {
        return "Ihre Eingabe war: " +  text;
    }
}

Server:
Code:
public static void main(String[] s) {
        try {
            LocateRegistry.createRegistry(1099);
            Manager mgr = (Manager) UnicastRemoteObject.exportObject(new ManagerImpl(), 0);
            RemoteServer.setLog(System.out);
            
            Registry reg = LocateRegistry.getRegistry();
            reg.rebind("Manager", mgr);
            
            System.out.println(reg);
            System.out.println("Manager läuft...");
        } catch (RemoteException ex) {
            Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

Client:
Code:
JPanel pan = new JPanel();

try {
            Registry reg = LocateRegistry.getRegistry("84.72.100.152", 1099);
            Manager mgr = (Manager) reg.lookup("Manager");
            
            System.out.println(mgr.getZahl());
            System.out.println(mgr.getText("Adrian Ambros Frey"));
            pan = mgr.getLoginPage();
        } catch (RemoteException ex) {
            Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NotBoundException ex) {
            Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
        }

Soweit funktioniert alles bis auf die JPanel übertragung. Wie bring ich das nun zum laufen. JPanel sollte ja Seriaziabel sein! Hab jensten schon versucht, bitte um Hilfe. Danke im Vorraus.
 
Zuletzt bearbeitet:
Da tun sich mehrere Fragen auf. Die grundsäzlichste: wer kommt auf die haarsträubnde Idee eine UI Klasse per RMI über die Leitung jagen zu wollen? Das ist IMHO grundfalsches Design.

In deinem Fall ist dann allerdings nicht das JPanel schuld. Du instantiierst eine LoginPage. Die Frage ist, ob das (inkl. aller member und members member) serialisierbar ist. Serialisierbarkeit ist nicht einfach gegeben, wenn man das Interface implementiert. Das Interface ist eher ein Marker, der verdeutlicht "Ich habe mir einen Kopf gemacht und dafür gesorgt, dass die Klasse wirklich serialisierbar ist", nicht andersrum.

Aber nochmal. Man schickt keine UI Instanzen übers Netz. Schon aus dem Grund nicht, weil ein Server nicht von UI Logik abhängig sein sollte. Ich würde an deiner Stelle nochmal das Manager Interface überdenken. Das riecht (nicht nur des Namens wegen) arg übel.

Gruß
Ollie
 
  • Gefällt mir
Reaktionen: AAF
Hallo Oliver

Die Idee dahinter ist, dass kein Client-Update oder eine neue Software-Version rausspringt. Das wäre möglich, wenn ich benötigte Klassen nachlade, wenn nötig.

Hier noch die Lösung:
Code:
public JPanel getLoginPage() throws RemoteException {
        LoginPage lp = new LoginPage();
        
        return lp.getPanel();
    }

=> Vorher: public class LoginPage extends JPanel. Ich gebe jetzt explizit JPanel zurück, so funktionierts :)
 
Zuletzt bearbeitet:
Zurück