Why do I get java.lang.ClassNotFoundException: ObservablePersistentBag on server

17 views
Skip to first unread message

Cory Showers

unread,
Aug 20, 2014, 5:43:26 PM8/20/14
to gran...@googlegroups.com
I'm having a strange problem and I'm not sure how to debug this.  When an entity gets updated on client by data publisher, I seem to have a problem when trying to serialize that same entity on server. This only occurs on some entities.  I'm trying to make this reproducible if I can find out whats actually triggering this.  I didn't always have this problem but something is breaking this flow now.  I get the following exception on the server.  This is odd because granite will convert all of my observable collections into real List collections on server.   But the stacktrace below does not tell me which field its having a problem with.  

I will attempt to backtrace and see if any recent commits broke something but our entities are all generated by granite and serialized automatically.    Can anyone explain what granite is complaining about here, is it saying that i'm trying to send a granite client class to the server which doesn't exist?

I'm using Java 8 on client and server.
granite: 3.1.0.RC1

java.lang.ClassNotFoundException: org.granite.client.javafx.persistence.collection.ObservablePersistentBag
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
        at org.granite.messaging.reflect.Reflection.loadClass(Reflection.java:97)
        at org.granite.messaging.jmf.JMFDeserializer.getClassDescriptor(JMFDeserializer.java:265)
        at org.granite.messaging.jmf.codec.std.impl.ObjectCodecImpl.decode(ObjectCodecImpl.java:165)
        at org.granite.messaging.jmf.JMFDeserializer.readObject(JMFDeserializer.java:130)
        at org.granite.messaging.jmf.JMFDeserializer.readAndSetProperty(JMFDeserializer.java:336)
        at org.granite.hibernate4.jmf.EntityCodec.decode(EntityCodec.java:172)
        at org.granite.messaging.jmf.codec.std.impl.ObjectCodecImpl.decode(ObjectCodecImpl.java:160)
        at org.granite.messaging.jmf.JMFDeserializer.readObject(JMFDeserializer.java:130)
        at org.granite.messaging.jmf.codec.std.impl.ObjectArrayCodecImpl.readObjectArray0(ObjectArrayCodecImpl.java:215)
        at org.granite.messaging.jmf.codec.std.impl.ObjectArrayCodecImpl.decode(ObjectArrayCodecImpl.java:165)
        at org.granite.messaging.jmf.JMFDeserializer.readObject(JMFDeserializer.java:130)
        at org.granite.messaging.jmf.persistence.JMFPersistentCollectionSnapshot.readCoreData(JMFPersistentCollectionSnapshot.java:167)
        at org.granite.hibernate4.jmf.AbstractPersistentCollectionCodec.decode(AbstractPersistentCollectionCodec.java:87)
        at org.granite.messaging.jmf.codec.std.impl.ObjectCodecImpl.decode(ObjectCodecImpl.java:160)
        at org.granite.messaging.jmf.JMFDeserializer.readObject(JMFDeserializer.java:130)
        at org.granite.messaging.jmf.JMFDeserializer.readAndSetProperty(JMFDeserializer.java:336)
        at org.granite.hibernate4.jmf.EntityCodec.decode(EntityCodec.java:172)
        at org.granite.messaging.jmf.codec.std.impl.ObjectCodecImpl.decode(ObjectCodecImpl.java:160)
        at org.granite.messaging.jmf.JMFDeserializer.readObject(JMFDeserializer.java:130)
        at org.granite.messaging.jmf.codec.std.impl.ObjectArrayCodecImpl.readObjectArray0(ObjectArrayCodecImpl.java:215)
        at org.granite.messaging.jmf.codec.std.impl.ObjectArrayCodecImpl.decode(ObjectArrayCodecImpl.java:165)
        at org.granite.messaging.jmf.JMFDeserializer.readObject(JMFDeserializer.java:130)
        at org.granite.messaging.jmf.persistence.JMFPersistentCollectionSnapshot.readCoreData(JMFPersistentCollectionSnapshot.java:167)
        at org.granite.hibernate4.jmf.AbstractPersistentCollectionCodec.decode(AbstractPersistentCollectionCodec.java:87)
        at org.granite.messaging.jmf.codec.std.impl.ObjectCodecImpl.decode(ObjectCodecImpl.java:160)
        at org.granite.messaging.jmf.JMFDeserializer.readObject(JMFDeserializer.java:130)
        at org.granite.messaging.jmf.JMFDeserializer.readAndSetProperty(JMFDeserializer.java:336)
        at org.granite.hibernate4.jmf.EntityCodec.decode(EntityCodec.java:172)
        at org.granite.messaging.jmf.codec.std.impl.ObjectCodecImpl.decode(ObjectCodecImpl.java:160)
        at org.granite.messaging.jmf.JMFDeserializer.readObject(JMFDeserializer.java:130)
        at org.granite.messaging.jmf.codec.std.impl.ObjectArrayCodecImpl.readObjectArray0(ObjectArrayCodecImpl.java:215)
        at org.granite.messaging.jmf.codec.std.impl.ObjectArrayCodecImpl.decode(ObjectArrayCodecImpl.java:165)
        at org.granite.messaging.jmf.JMFDeserializer.readObject(JMFDeserializer.java:130)
        at org.granite.messaging.jmf.codec.std.impl.ObjectArrayCodecImpl.readObjectArray0(ObjectArrayCodecImpl.java:215)
        at org.granite.messaging.jmf.codec.std.impl.ObjectArrayCodecImpl.decode(ObjectArrayCodecImpl.java:165)
         ...     
         at org.granite.messaging.jmf.JMFDeserializer.readObject(JMFDeserializer.java:130)
        at org.granite.messaging.jmf.codec.std.impl.ArrayListCodecImpl.decode(ArrayListCodecImpl.java:84)
        at org.granite.messaging.jmf.codec.std.impl.ArrayListCodecImpl.decode(ArrayListCodecImpl.java:40)
        at org.granite.messaging.jmf.JMFDeserializer.readObject(JMFDeserializer.java:130)
        at org.granite.messaging.jmf.JMFDeserializer.readAndSetProperty(JMFDeserializer.java:336)
        at org.granite.messaging.jmf.codec.std.impl.ObjectCodecImpl.decodeSerializable(ObjectCodecImpl.java:241)
        at org.granite.messaging.jmf.codec.std.impl.ObjectCodecImpl.decodeSerializable(ObjectCodecImpl.java:226)
        at org.granite.messaging.jmf.codec.std.impl.ObjectCodecImpl.decode(ObjectCodecImpl.java:179)
        at org.granite.messaging.jmf.JMFDeserializer.readObject(JMFDeserializer.java:130)
        at org.granite.messaging.webapp.AMFEndpoint.serviceJMFAMF(AMFEndpoint.java:147)
        at org.granite.messaging.webapp.AMFEndpoint.service(AMFEndpoint.java:64)
        at org.granite.spring.ServerFilter.handle(ServerFilter.java:331)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
        at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)

....

Cory Showers

unread,
Aug 22, 2014, 4:21:46 PM8/22/14
to gran...@googlegroups.com
After some investigating the problem boiled down to an null collection on server getting initialized on client as part of a granite data push update.  The entity can no longer be serialized back to server with the ClassNotFound Exception.  The value of the collection is ObservableListWrapper and the class it wraps is ObservablePersistentBag which is a problem when serializing.   The workaround was to define a default collection as an empty ArrayList so granite doesn't have to instantiate it later.  When this is done the value of the ObserableList is ObservablePersistentBag and not ObservableListWrapper.  The property is correctly serialized back to the server as an empty ArrayList.

Thankfully I raised a bug about a similar issue in Jira https://jira.granitedataservices.com/browse/GDS-1332   which is now fixed and seems to resolve both issues I had.
Reply all
Reply to author
Forward
0 new messages