Issue Details (XML | Word | Printable)

Key: GDS-639
Type: Bug Bug
Status: Resolved Resolved
Resolution: Fixed
Priority: Minor Minor
Assignee: Franck Wolff
Reporter: Damien Feugas
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
GraniteDS

Use of "hibernate-collection-metadata" in granite-config may trigger NPE

Created: 22/Feb/10 06:13 PM   Updated: 26/Feb/10 02:26 PM   Resolved: 26/Feb/10 02:26 PM
Component/s: AMF3 (de)serialization
Affects Version/s: 2.1.0_RC2
Fix Version/s: 2.1.0_GA


 Description  « Hide
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.


Damien Feugas added a comment - 22/Feb/10 06:14 PM
A workaround is just to remove the

     <configuration>
            <hibernate-collection-metadata>lazy</hibernate-collection-metadata>
     </configuration>

from the granite-config.xml file.

For me, it seems to work perfectly after.

Franck Wolff added a comment - 26/Feb/10 02:26 PM
The test is now:

if (metadata != null && ...) {
    ...
}

That must fix the NPE and, hopefully, doesn't break any functionality with this option.

Reopen this issue if you experience any problem.