When using the following configuration in granite-config.xml :
<externalizers>
<configuration>
<hibernate-collection-metadata>lazy</hibernate-collection-metadata>
</configuration>
A NullPointerException may occurs when passing an entity with a lazy collection from server to client :
22-02-2010 18:10:39:952 ERROR AMFMessageFilter - AMF message error
org.granite.messaging.amf.io.AMF3SerializationException
at org.granite.messaging.amf.io.AMF3Deserializer.readObject(AMF3Deserializer.java:106)
at org.granite.messaging.amf.io.AMF3Deserializer.readAMF3Array(AMF3Deserializer.java:335)
at org.granite.messaging.amf.io.AMF3Deserializer.readObject(AMF3Deserializer.java:141)
at org.granite.messaging.amf.io.AMF3Deserializer.readAMF3Object(AMF3Deserializer.java:569)
at org.granite.messaging.amf.io.AMF3Deserializer.readObject(AMF3Deserializer.java:143)
at org.granite.messaging.amf.io.AMF3Deserializer.readObject(AMF3Deserializer.java:98)
at org.granite.messaging.amf.io.AMF0Deserializer.readAMF3Data(AMF0Deserializer.java:341)
at org.granite.messaging.amf.io.AMF0Deserializer.readData(AMF0Deserializer.java:400)
at org.granite.messaging.amf.io.AMF0Deserializer.readArray(AMF0Deserializer.java:248)
at org.granite.messaging.amf.io.AMF0Deserializer.readData(AMF0Deserializer.java:386)
at org.granite.messaging.amf.io.AMF0Deserializer.readBodies(AMF0Deserializer.java:151)
at org.granite.messaging.amf.io.AMF0Deserializer.<init>(AMF0Deserializer.java:82)
at org.granite.messaging.webapp.AMFMessageFilter.doFilter(AMFMessageFilter.java:124)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.RuntimeException: Could not read externalized object:
com.myth.model.type.ActorType@96bd8c48
at org.granite.messaging.amf.io.AMF3Deserializer.readAMF3Object(AMF3Deserializer.java:523)
at org.granite.messaging.amf.io.AMF3Deserializer.readObject(AMF3Deserializer.java:143)
at org.granite.messaging.amf.io.AMF3Deserializer.readObject(AMF3Deserializer.java:98)
... 24 more
Caused by: java.lang.NullPointerException
at org.granite.hibernate.HibernateExternalizer.newHibernateCollection(HibernateExternalizer.java:260)
at org.granite.hibernate.HibernateExternalizer.readExternal(HibernateExternalizer.java:191)
at org.granite.messaging.amf.io.AMF3Deserializer.readAMF3Object(AMF3Deserializer.java:515)
... 26 more
Unfortunatly, I'm not able to create a Proof Of Concept to illustrate the problem.
I think the RC2 is involved, because I did not change anything relative to this entity since I port my application from RC1 to RC2.
The only thing sure is that in the following code (class org.granite.hibernate.HibernateExternalizer, line 204 to 260):
protected PersistentCollection newHibernateCollection(AbstractExternalizablePersistentCollection value, Property field) {
...
final String metadata = value.getMetadata();
...
if (serializeMetadata != SerializeMetadata.NO && (serializeMetadata == SerializeMetadata.YES || !initialized)) {
String[] toks = metadata.split(":", 3);
the medatada attribute of the value parameter is null.
<configuration>
<hibernate-collection-metadata>lazy</hibernate-collection-metadata>
</configuration>
from the granite-config.xml file.
For me, it seems to work perfectly after.