All you need is your RMI bundle to track a ?Marshaller? interface which
bundles, interested in having their services RMI'd, register an impl which
handles the (un)marshalling. The services might have a property listing the
types they handle, or maybe it's a method call to test for support...

- Ray

On Wed, Feb 25, 2015 at 12:19 PM, Łukasz Dywicki <luk...@dywicki.pl> wrote:

> A while ago I had similar issue as yours which was affecting our RMI-based
> integration. Since I didn't want to turn on JVM security and enable RMI
> class loader I did following:
> 1. embedded all RMI contract classes which could be possibly loaded via RMI
> 2. my RMI client was executed from servlet thread so I had to override
> thread context class loader for each invocation.
>
> Best regards,
> Lukasz
>
> 2015-02-25 18:14 GMT+01:00 Endo Alejandro <alejandro.e...@grassvalley.com>
> :
>
>>  Hello everyone
>>
>> We are having an issue where we have a class that is an entry point to
>> RMI (an rmi proxy). As such, it deserializes remote objects before passing
>> them to the appropriate entity. However, this generic “gate-keeper” is
>> throwing an ClassNotFoundException since it doesn’t have a wire for the
>> class that it is trying to deserialize
>>
>> *java.rmi.ServerException*: *RemoteException* occurred in server thread;
>> nested exception is:
>> *java.rmi.UnmarshalException*: error unmarshalling arguments; nested
>> exception is:
>> *java.lang.ClassNotFoundException*: com.foo.SupportedCommand
>> at sun.rmi.server.UnicastServerRef.dispatch(*UnicastServerRef.java:354*)
>> at sun.rmi.transport.Transport$1.run(*Transport.java:178*)
>> at sun.rmi.transport.Transport$1.run(*Transport.java:175*)
>> at java.security.AccessController.doPrivileged(*Native Method*)
>> at sun.rmi.transport.Transport.serviceCall(*Transport.java:174*)
>> at sun.rmi.transport.tcp.TCPTransport.handleMessages(
>> *TCPTransport.java:557*)
>> at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(
>> *TCPTransport.java:812*)
>> at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(
>> *TCPTransport.java:671*)
>> at java.util.concurrent.ThreadPoolExecutor.runWorker(
>> *ThreadPoolExecutor.java:1142*)
>> at java.util.concurrent.ThreadPoolExecutor$Worker.run(
>> *ThreadPoolExecutor.java:617*)
>> at java.lang.Thread.run(*Thread.java:745*)
>> at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(
>> *StreamRemoteCall.java:276*)
>> at sun.rmi.transport.StreamRemoteCall.executeCall(
>> *StreamRemoteCall.java:253*)
>> at sun.rmi.server.UnicastRef.invoke(*UnicastRef.java:162*)
>> at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(
>> *RemoteObjectInvocationHandler.java:194*)
>> at java.rmi.server.RemoteObjectInvocationHandler.invoke(
>> *RemoteObjectInvocationHandler.java:148*)
>> at com.sun.proxy.$Proxy1.setParameter(Unknown Source)
>> at com.foo.proxy.GenericProxy.setParameter
>> at com.foo.proxy.AlarmManager$3.setParameter
>> at com.foo.proxy.AlarmManager$3.run
>> at com.foo.ThreadPool$PooledThread.run
>> Caused by: *java.rmi.UnmarshalException*: error unmarshalling arguments;
>> nested exception is:
>> *java.lang.ClassNotFoundException*: com.foo.SupportedCommand
>> at sun.rmi.server.UnicastServerRef.dispatch(*UnicastServerRef.java:314*)
>> at sun.rmi.transport.Transport$1.run(*Transport.java:178*)
>> at sun.rmi.transport.Transport$1.run(*Transport.java:175*)
>> at java.security.AccessController.doPrivileged(*Native Method*)
>> at sun.rmi.transport.Transport.serviceCall(*Transport.java:174*)
>> at sun.rmi.transport.tcp.TCPTransport.handleMessages(
>> *TCPTransport.java:557*)
>> at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(
>> *TCPTransport.java:812*)
>> at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(
>> *TCPTransport.java:671*)
>> at java.util.concurrent.ThreadPoolExecutor.runWorker(
>> *ThreadPoolExecutor.java:1142*)
>> at java.util.concurrent.ThreadPoolExecutor$Worker.run(
>> *ThreadPoolExecutor.java:617*)
>> at java.lang.Thread.run(*Thread.java:745*)
>> Caused by: *java.lang.ClassNotFoundException*: com.foo.SupportedCommand
>> at java.net.URLClassLoader$1.run(*URLClassLoader.java:372*)
>> at java.net.URLClassLoader$1.run(*URLClassLoader.java:361*)
>> at java.security.AccessController.doPrivileged(*Native Method*)
>> at java.net.URLClassLoader.findClass(*URLClassLoader.java:360*)
>> at java.lang.ClassLoader.loadClass(*ClassLoader.java:424*)
>> at java.lang.ClassLoader.loadClass(*ClassLoader.java:357*)
>> at java.lang.Class.forName0(*Native Method*)
>> at java.lang.Class.forName(*Class.java:340*)
>> at com.foo.rmi.LoaderHandler.loadClass
>> at com.foo.rmi.LoaderHandler.loadClass
>> at com.foo.rmi.ClassLoaderProvider.loadClass
>> at java.rmi.server.RMIClassLoader.loadClass(*RMIClassLoader.java:264*)
>> at sun.rmi.server.MarshalInputStream.resolveClass(
>> *MarshalInputStream.java:214*)
>> at java.io.ObjectInputStream.readNonProxyDesc(
>> *ObjectInputStream.java:1613*)
>> at java.io.ObjectInputStream.readClassDesc(*ObjectInputStream.java:1518*)
>> at java.io.ObjectInputStream.readOrdinaryObject(
>> *ObjectInputStream.java:1774*)
>> at java.io.ObjectInputStream.readObject0(*ObjectInputStream.java:1351*)
>> at java.io.ObjectInputStream.readObject(*ObjectInputStream.java:371*)
>> at sun.rmi.server.UnicastRef.unmarshalValue(*UnicastRef.java:326*)
>> at sun.rmi.server.UnicastServerRef.dispatch(*UnicastServerRef.java:308*)
>> ... 10 more
>>
>> We hacked it by adding an explicit import-package in the bundle of the
>> proxy to com.foo since it is the package that contains SupportedCommand; it
>> works, but maintaining an explicit list of import-packages is always a
>> red-flag to me since it seems error-prone and a pain to maintain in the
>> long run. So I’m wondering what is the clean way to do this. It seems that
>> the model of static import-package doesn’t work well in such a bundle (i.e.
>> the bundle that contains and RMI proxy which should be allowed to know any
>> class that might come via RMI), is this a justified case for a
>> dynamicImport-package or is there a better idiom for these cases??
>>
>>
>>
>> I would appreciate any thoughts on this, how have others solved this
>> issue?
>>
>>
>>
>> Thank you,
>>
>>
>>
>> Alejandro
>>
>>
>>
>> DISCLAIMER: Privileged and/or Confidential information may be contained
>> in this message. If you are not the addressee of this message, you may not
>> copy, use or deliver this message to anyone. In such event, you should
>> destroy the message and kindly notify the sender by reply e-mail. It is
>> understood that opinions or conclusions that do not relate to the official
>> business of the company are neither given nor endorsed by the company.
>> Thank You.
>>
>> _______________________________________________
>> OSGi Developer Mail List
>> osgi-dev@mail.osgi.org
>> https://mail.osgi.org/mailman/listinfo/osgi-dev
>>
>
>
> _______________________________________________
> OSGi Developer Mail List
> osgi-dev@mail.osgi.org
> https://mail.osgi.org/mailman/listinfo/osgi-dev
>



-- 
*Raymond Augé* <http://www.liferay.com/web/raymond.auge/profile>
 (@rotty3000)
Senior Software Architect *Liferay, Inc.* <http://www.liferay.com>
 (@Liferay)
Board Member & EEG Co-Chair, OSGi Alliance <http://osgi.org> (@OSGiAlliance)
_______________________________________________
OSGi Developer Mail List
osgi-dev@mail.osgi.org
https://mail.osgi.org/mailman/listinfo/osgi-dev

Reply via email to