java.rmi.UnmarshalException: ошибка необратимого возврата;Вложенное исключение: java.lang.ClassNotFoundException: - PullRequest
0 голосов
/ 20 октября 2011

У меня следующая ситуация:

При использовании RMI я заметил, что в конкретной ситуации у клиента RMI не было класса, экземпляр которого был отправлен через RMI.Итак, я отправил класс в форме Byte [], а затем загрузил его с загрузчиком класса, который я определил.

Код на стороне клиента выглядит примерно так:

pp = plugins.getPanelClasses(); //RMI method
panelClassLoader pcl = new panelClassLoader(); //simple class loader defined by me
String name = pcl.defineClass(pp);

Тогдая спрашиваю на стороне клиента экземпляр загруженного класса:

HashMap<String, PluginPanel> panels = null;
try
{
panels = plugins.getSettingsPanels();
} catch (RemoteException ex)
{
    Logger.getLogger(ServerOptions.class.getName()).log(Level.SEVERE, null, ex);
}

PluginPanel - это интерфейс, чьи реализующие классы не всегда находятся в клиенте ...

и загрузчик классовis:

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();
    }
}

Тем не менее, я застрял со следующей ошибкой: java.rmi.UnmarshalException: ошибка unmarshalling return;Вложенное исключение: java.lang.ClassNotFoundException: pt.ua.dicoogle.IndexPlugin.CPanel (нет менеджера безопасности: загрузчик классов RMI отключен) в sun.rmi.server.UnicastRef.invoke (UnicastRef.java:178) в java.rmiДоменwindows.ServerOptions. (ServerOptions.java:176)

Причина: java.lang.ClassNotFoundException: pt.ua.dicoogle.IndexPlugin.CPanel (без менеджера безопасности: загрузчик классов RMI отключен) в sun.rmi.server.LoaderHandler.loadClass (LoaderHandler.java:375) в sun.rmi.server.LoaderHandler.loadClass (LoaderHandler.java:165) в java.rmi.server.RMIClassLoader $ 2.loadClass (RMIClassLoader.java:620) в java.rmi.server.RMIClassLoader.loadClass (RMIClassLoader.java:247) в sun.rmi.server.MarshalInputStream.resolveClass (MarshalInputStream.java:197) в java.io.ObjectInputStream.readNonProxyDesc (ObjectInputStream.java:1574) в java.io.ObjectInputStream.readClassDesc (ObjectInputStream.java:1495) в java.io.ObjectInputStream.readOrdInStbject.jectOject) в java.io.ObjectInputStream.readObject0 (ObjectInputStream.java:1328) в java.io.ObjectInputStream.readObject (ObjectInputStream.java:350) в java.util.HashMap.readObject (HashMap.java:1030) на солнце..NativeMethodAccessorImpl.invoke0 (нативный метод) в sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39) в sun.reflect.DelegatingMethodAccessorImpl.invoke (methodava.hoke.jref.jref.jj.java: 597) в java.io.ObjectStreamClass.invokeReadObject (ObjectStreamClass.java:974) в java.io.ObjectInputStream.readSerialData (ObjectInputStream.java:1848) в java.io.ObjectInputStream.readOrdinaryObject (jj)в java.io.ObjectInputStream.readObject0 (ObjectInputStream.java:1328) в java.io.ObjectInputStream.readObject (ObjectInputStream.java:350) в sun.rmi.server.UnicastRef.unmarshalValue (UnicastRef.java:306) в sun.rmi.server.UnicastRef.invoke (UnicastRef.java:155)

Любое предложение?

1 Ответ

2 голосов
/ 21 октября 2011

Вы должны вызывать удаленный метод в контексте этого загрузчика классов.Не очень хорошая схема.Внимательно ознакомьтесь с функцией кодовой базы RMI, она рассчитана именно на эту ситуацию.

...