Quantcast

render as JSON/XML with Blob causes problems

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

render as JSON/XML with Blob causes problems

rsom@certifydatasystems.com
Hi,

I had a domain object that looks like this:

    class AuditMessage {
      ...
      byte[] data
      String getDataAsString() {
        new String(data)
      }
      void setDataAsString(String dataStr) {
        data = dataStr.bytes
      }
      ...
    }

The problem was: with Oracle, inserts were taking a long time when data was of type LONG RAW. So I migrated to BLOB. And my insert performance improved immediately.

    class AuditMessage {
      ...
      Blob data
      String getDataAsString() {
        ... code too long to explain ...
      }
      void setDataAsString(String dataStr) {
        data = Hibernate.createBlob(dataStr.bytes)
      }
      ...
    }
    
However I started seeing a problem in my restful controller.

Class org.codehaus.groovy.grails.web.converters.marshaller.json.GenericJavaBeanMarshaller can not access a member of class oracle.jdbc.driver.OracleBufferedStream with modifiers "public". Stacktrace follows:
java.lang.IllegalAccessException: Class org.codehaus.groovy.grails.web.converters.marshaller.json.GenericJavaBeanMarshaller can not access a member of class oracle.jdbc.driver.OracleBufferedStream with modifiers "public"
at grails.converters.JSON.value(JSON.java:199)
at grails.converters.JSON.convertAnother(JSON.java:162)
at grails.converters.JSON.value(JSON.java:199)
at grails.converters.JSON.convertAnother(JSON.java:162)
at grails.converters.JSON.value(JSON.java:199)
at grails.converters.JSON.convertAnother(JSON.java:162)
at grails.converters.JSON.value(JSON.java:199)
at grails.converters.JSON.convertAnother(JSON.java:162)
at grails.converters.JSON.value(JSON.java:199)
at grails.converters.JSON.convertAnother(JSON.java:162)
at grails.converters.JSON.value(JSON.java:199)
at grails.converters.JSON.convertAnother(JSON.java:162)
at grails.converters.JSON.value(JSON.java:199)
at grails.converters.JSON.render(JSON.java:134)
at grails.converters.JSON.render(JSON.java:150)
at com.cds.healthdock.audit.AuditMessageController$_list_closure2_closure7.doCall(AuditMessageController.groovy:60)
at com.cds.healthdock.audit.AuditMessageController.list(AuditMessageController.groovy:56)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)

Also the generated json stops being generated with the field data, like this:

    "data":{"binaryStream":{"class":"oracle.jdbc.driver.OracleBlobInputStream"

 
Any suggestions on how this can be fixed?

R,
rahul
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

Re: render as JSON/XML with Blob causes problems

rsom@certifydatasystems.com
Bump!

On Jun 28, 2012, at 5:33 PM, Rahul Somasunderam wrote:

Hi,

I had a domain object that looks like this:

    class AuditMessage {
      ...
      byte[] data
      String getDataAsString() {
        new String(data)
      }
      void setDataAsString(String dataStr) {
        data = dataStr.bytes
      }
      ...
    }

The problem was: with Oracle, inserts were taking a long time when data was of type LONG RAW. So I migrated to BLOB. And my insert performance improved immediately.

    class AuditMessage {
      ...
      Blob data
      String getDataAsString() {
        ... code too long to explain ...
      }
      void setDataAsString(String dataStr) {
        data = Hibernate.createBlob(dataStr.bytes)
      }
      ...
    }
    
However I started seeing a problem in my restful controller.

Class org.codehaus.groovy.grails.web.converters.marshaller.json.GenericJavaBeanMarshaller can not access a member of class oracle.jdbc.driver.OracleBufferedStream with modifiers "public". Stacktrace follows:
java.lang.IllegalAccessException: Class org.codehaus.groovy.grails.web.converters.marshaller.json.GenericJavaBeanMarshaller can not access a member of class oracle.jdbc.driver.OracleBufferedStream with modifiers "public"
at grails.converters.JSON.value(JSON.java:199)
at grails.converters.JSON.convertAnother(JSON.java:162)
at grails.converters.JSON.value(JSON.java:199)
at grails.converters.JSON.convertAnother(JSON.java:162)
at grails.converters.JSON.value(JSON.java:199)
at grails.converters.JSON.convertAnother(JSON.java:162)
at grails.converters.JSON.value(JSON.java:199)
at grails.converters.JSON.convertAnother(JSON.java:162)
at grails.converters.JSON.value(JSON.java:199)
at grails.converters.JSON.convertAnother(JSON.java:162)
at grails.converters.JSON.value(JSON.java:199)
at grails.converters.JSON.convertAnother(JSON.java:162)
at grails.converters.JSON.value(JSON.java:199)
at grails.converters.JSON.render(JSON.java:134)
at grails.converters.JSON.render(JSON.java:150)
at com.cds.healthdock.audit.AuditMessageController$_list_closure2_closure7.doCall(AuditMessageController.groovy:60)
at com.cds.healthdock.audit.AuditMessageController.list(AuditMessageController.groovy:56)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)

Also the generated json stops being generated with the field data, like this:

    "data":{"binaryStream":{"class":"oracle.jdbc.driver.OracleBlobInputStream"

 
Any suggestions on how this can be fixed?

R,
rahul

Loading...