Hallo alle zusammen,
ich baue zurzeit eine Client-/Server-Anwendung und habe einige Probleme mit RMI. Mein Server stellt Dienste bereit die ich mit dem Client nutzen will. Ich habe bereits eine Funktion über den Proxy aufgerufen (teste lokal) und alles hat bestens funktioniert. Der Rückgabewert der Funktion war ein Array, daher gab es da noch keine Probleme mit dem serialisieren. Wenn ich jedoch eine andere Methode mit einem eigens definiertem Objekttypen als Rückgabewert aufrufe, kommt folgender Fehler:
Es soll also ein Objekt vom Typ Person zurückgegeben werden. Ich habe den Server bereits kontrolliert und er nimmt den Aufruf in der Fassade entgegen, besorgt das Objekt und leitet es dann wieder zurück. Der Fehler besteht also auf Seite des Clients. Nun ist mir nicht ganz klar ob ich richtig liege: Auf Clientseite wird die Klasse Person nicht gefunden um das Objekt wieder neu zu bauen - richtig ? Man kann ja die class-Dateien entweder direkt in einem Verzeichnis haben oder per Classloader nachladen lassen. Beides habe ich versucht, beides ist gescheitert. Auf Seite des Servers liegt die Person.java-Datei im Paket server.classes . Warum gibt er bei der Fehlermeldung java.lang.ClassNotFoundException: server.classes.Person ebenfalls die Paketnamen mit an und nicht lediglich den Klassennamen ?
Ich komme hier nicht weiter und habe leider auch nichts hilfreiches im Netz darüber gefunden. Es wäre toll wenn ihr ein paar Tipps für mich übrig hättet.
Viele Grüße
bluma
ich baue zurzeit eine Client-/Server-Anwendung und habe einige Probleme mit RMI. Mein Server stellt Dienste bereit die ich mit dem Client nutzen will. Ich habe bereits eine Funktion über den Proxy aufgerufen (teste lokal) und alles hat bestens funktioniert. Der Rückgabewert der Funktion war ein Array, daher gab es da noch keine Probleme mit dem serialisieren. Wenn ich jedoch eine andere Methode mit einem eigens definiertem Objekttypen als Rückgabewert aufrufe, kommt folgender Fehler:
Code:
java.lang.reflect.UndeclaredThrowableException
at $Proxy0.getPerson(Unknown Source)
at de.tetra.keymanager.core.client.handlers.CallPersonEditor.execute(CallPersonEditor.java:47)
at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:240)
at org.eclipse.core.commands.Command.executeWithChecks(Command.java:475)
at org.eclipse.ui.internal.handlers.HandlerService.executeCommand(HandlerService.java:174)
at org.eclipse.ui.internal.handlers.SlaveHandlerService.executeCommand(SlaveHandlerService.java:253)
at org.eclipse.ui.internal.handlers.SlaveHandlerService.executeCommand(SlaveHandlerService.java:253)
at de.tetra.keymanager.core.client.views.ViewPersons$1.doubleClick(ViewPersons.java:88)
at org.eclipse.jface.viewers.StructuredViewer$1.run(StructuredViewer.java:799)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37)
at org.eclipse.core.runtime.Platform.run(Platform.java:857)
at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:46)
at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:199)
at org.eclipse.jface.viewers.StructuredViewer.fireDoubleClick(StructuredViewer.java:797)
at org.eclipse.jface.viewers.StructuredViewer.handleDoubleSelect(StructuredViewer.java:1061)
at org.eclipse.jface.viewers.StructuredViewer$4.widgetDefaultSelected(StructuredViewer.java:1173)
at org.eclipse.jface.util.OpenStrategy.fireDefaultSelectionEvent(OpenStrategy.java:237)
at org.eclipse.jface.util.OpenStrategy.access$0(OpenStrategy.java:234)
at org.eclipse.jface.util.OpenStrategy$1.handleEvent(OpenStrategy.java:295)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:938)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3682)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3293)
at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2389)
at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2353)
at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2219)
at org.eclipse.ui.internal.Workbench$4.run(Workbench.java:466)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:289)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:461)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
at client2.Application.start(Application.java:29)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:169)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:106)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:76)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:363)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:176)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:508)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:447)
at org.eclipse.equinox.launcher.Main.run(Main.java:1173)
at org.eclipse.equinox.launcher.Main.main(Main.java:1148)
Caused by: [b]java.rmi.UnexpectedException: unexpected exception; nested exception is:
java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
java.lang.ClassNotFoundException: server.classes.Person[/b]
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source)
... 44 more
Caused by: java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
java.lang.ClassNotFoundException: server.classes.Person
at sun.rmi.server.UnicastRef.invoke(Unknown Source)
... 46 more
Caused by: java.lang.ClassNotFoundException: server.classes.Person
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at sun.rmi.server.LoaderHandler.loadClass(Unknown Source)
at sun.rmi.server.LoaderHandler.loadClass(Unknown Source)
at java.rmi.server.RMIClassLoader$2.loadClass(Unknown Source)
at java.rmi.server.RMIClassLoader.loadClass(Unknown Source)
at sun.rmi.server.MarshalInputStream.resolveClass(Unknown Source)
at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
at java.io.ObjectInputStream.readClassDesc(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at sun.rmi.server.UnicastRef.unmarshalValue(Unknown Source)
... 47 more
Es soll also ein Objekt vom Typ Person zurückgegeben werden. Ich habe den Server bereits kontrolliert und er nimmt den Aufruf in der Fassade entgegen, besorgt das Objekt und leitet es dann wieder zurück. Der Fehler besteht also auf Seite des Clients. Nun ist mir nicht ganz klar ob ich richtig liege: Auf Clientseite wird die Klasse Person nicht gefunden um das Objekt wieder neu zu bauen - richtig ? Man kann ja die class-Dateien entweder direkt in einem Verzeichnis haben oder per Classloader nachladen lassen. Beides habe ich versucht, beides ist gescheitert. Auf Seite des Servers liegt die Person.java-Datei im Paket server.classes . Warum gibt er bei der Fehlermeldung java.lang.ClassNotFoundException: server.classes.Person ebenfalls die Paketnamen mit an und nicht lediglich den Klassennamen ?
Ich komme hier nicht weiter und habe leider auch nichts hilfreiches im Netz darüber gefunden. Es wäre toll wenn ihr ein paar Tipps für mich übrig hättet.
Viele Grüße
bluma
Zuletzt bearbeitet: