java.rmi.UnmarshalException: error unmarshalling return; nested exception is:java.lang.ClassNotFoundException:
Ich habe die folgende situation:
Verwendung von RMI, bemerkte ich, dass unter einer bestimmten situation, den RMI-client hat nicht die Klasse, deren Instanz gesendet wurde, per RMI. So, ich habe die Klasse in der Form von Byte [] und dann geladen wird es mit einem class-loader habe ich definiert.
Den code in der client-Seite ist so etwas wie:
pp = plugins.getPanelClasses(); //RMI method
panelClassLoader pcl = new panelClassLoader(); //simple class loader defined by me
String name = pcl.defineClass(pp);
Dann Frage ich in der client-Seite durch die Instanz der Klasse geladen:
HashMap<String, PluginPanel> panels = null;
try
{
panels = plugins.getSettingsPanels();
} catch (RemoteException ex)
{
Logger.getLogger(ServerOptions.class.getName()).log(Level.SEVERE, null, ex);
}
PluginPanel ist eine Schnittstelle, deren Implementierung sind die Klassen nicht immer in der client -...
- und der class-loader ist:
private class panelClassLoader extends ClassLoader
{
public panelClassLoader(ClassLoader parent)
{
super(parent);
}
public panelClassLoader()
{
super(getSystemClassLoader());
}
public String defineClass(byte[] b)
{
Class c = super.defineClass(null, b, 0, b.length);
resolveClass(c);
return c.getName();
}
}
Dennoch, ich bin stecken mit der folgenden Fehlermeldung:
java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
java.lang.ClassNotFoundException: pt.ua.dicoogle.IndexPlugin.CPanel (no security manager: RMI class loader disabled)
bei der sun.rmi.server.UnicastRef.invoke(UnicastRef.java:178)
bei java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:178)
bei java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:132)
bei $Proxy22.getSettingsPanels(Quelle Unbekannt)
bei pt.ua.dicoogle.rGUI.client.windows.ServerOptions.(ServerOptions.java:176)
Verursacht durch: java.lang.ClassNotFoundException: pt.ua.dicoogle.IndexPlugin.CPanel (no security manager: RMI class loader disabled)
bei der sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:375)
bei der sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:165)
bei java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:620)
bei java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:247)
bei der sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:197)
bei java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1574)
bei java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495)
bei java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1731)
bei java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
bei java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
bei java.util.HashMap.readObject(HashMap.java:1030)
bei der sun.reflektieren.NativeMethodAccessorImpl.invoke0(Native-Methode)
bei der sun.reflektieren.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
bei der sun.reflektieren.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
bei java.lang.reflektieren.Methode.invoke(Method.java:597)
bei java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)
bei java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1848)
bei java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
bei java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
bei java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
bei der sun.rmi.server.UnicastRef.unmarshalValue(UnicastRef.java:306)
bei der sun.rmi.server.UnicastRef.invoke(UnicastRef.java:155)
Jede sugestion?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssten Sie zum aufrufen des remote-Methode im Kontext der Klasse loader. Keine gute Regelung. Haben Sie einen guten Blick auf die RMI-codebase-Funktion ist es für genau diese situation.