Search code examples
javagrails

Grails throws ConverterException from Marshaller after using grails plugin


I have Marshaller in my grails application which was working fine but after I integrated plugin in my application it is throwing error.Error is as follows:

Caused by: org.grails.web.converters.exceptions.ConverterException: Error converting Bean with class org.hibernate.persister.entity.SingleTableEntityPersister at org.grails.web.converters.marshaller.json.GenericJavaBeanMarshaller.marshalObject(GenericJavaBeanMarshaller.java:84) at org.grails.web.converters.marshaller.json.GenericJavaBeanMarshaller.marshalObject(GenericJavaBeanMarshaller.java:39) at grails.converters.JSON.value(JSON.java:184) at grails.converters.JSON.convertAnother(JSON.java:144) at org.grails.web.converters.marshaller.json.MapMarshaller.marshalObject(MapMarshaller.java:45) at org.grails.web.converters.marshaller.json.MapMarshaller.marshalObject(MapMarshaller.java:30) at grails.converters.JSON.value(JSON.java:184) at grails.converters.JSON.convertAnother(JSON.java:144) at org.grails.web.converters.marshaller.json.GenericJavaBeanMarshaller.marshalObject(GenericJavaBeanMarshaller.java:66) at org.grails.web.converters.marshaller.json.GenericJavaBeanMarshaller.marshalObject(GenericJavaBeanMarshaller.java:39) at grails.converters.JSON.value(JSON.java:184) at grails.converters.JSON.convertAnother(JSON.java:144) at org.grails.web.converters.marshaller.json.GenericJavaBeanMarshaller.marshalObject(GenericJavaBeanMarshaller.java:66) at org.grails.web.converters.marshaller.json.GenericJavaBeanMarshaller.marshalObject(GenericJavaBeanMarshaller.java:39) at grails.converters.JSON.value(JSON.java:184) at grails.converters.JSON.convertAnother(JSON.java:144) at org.grails.web.converters.marshaller.json.GenericJavaBeanMarshaller.marshalObject(GenericJavaBeanMarshaller.java:66) at org.grails.web.converters.marshaller.json.GenericJavaBeanMarshaller.marshalObject(GenericJavaBeanMarshaller.java:39) at grails.converters.JSON.value(JSON.java:184) at grails.converters.JSON.convertAnother(JSON.java:144) at org.grails.web.converters.marshaller.json.GroovyBeanMarshaller.marshalObject(GroovyBeanMarshaller.java:67) at org.grails.web.converters.marshaller.json.GroovyBeanMarshaller.marshalObject(GroovyBeanMarshaller.java:39) at grails.converters.JSON.value(JSON.java:184) at grails.converters.JSON.convertAnother(JSON.java:144) at org.grails.web.converters.marshaller.json.MapMarshaller.marshalObject(MapMarshaller.java:45) at org.grails.web.converters.marshaller.json.MapMarshaller.marshalObject(MapMarshaller.java:30) at grails.converters.JSON.value(JSON.java:184) at grails.converters.JSON.convertAnother(JSON.java:144) at org.grails.web.converters.marshaller.json.GroovyBeanMarshaller.marshalObject(GroovyBeanMarshaller.java:67) at org.grails.web.converters.marshaller.json.GroovyBeanMarshaller.marshalObject(GroovyBeanMarshaller.java:39) at grails.converters.JSON.value(JSON.java:184) at grails.converters.JSON.convertAnother(JSON.java:144) at org.grails.web.converters.marshaller.json.GroovyBeanMarshaller.marshalObject(GroovyBeanMarshaller.java:67) at org.grails.web.converters.marshaller.json.GroovyBeanMarshaller.marshalObject(GroovyBeanMarshaller.java:39) at grails.converters.JSON.value(JSON.java:184) at grails.converters.JSON.convertAnother(JSON.java:144) at org.grails.web.converters.marshaller.json.CollectionMarshaller.marshalObject(CollectionMarshaller.java:41) at org.grails.web.converters.marshaller.json.CollectionMarshaller.marshalObject(CollectionMarshaller.java:30) at grails.converters.JSON.value(JSON.java:184) at grails.converters.JSON.convertAnother(JSON.java:144) at org.grails.web.converters.marshaller.json.GroovyBeanMarshaller.marshalObject(GroovyBeanMarshaller.java:67) at org.grails.web.converters.marshaller.json.GroovyBeanMarshaller.marshalObject(GroovyBeanMarshaller.java:39) at grails.converters.JSON.value(JSON.java:184) at grails.converters.JSON.convertAnother(JSON.java:144) at org.grails.web.converters.marshaller.json.CollectionMarshaller.marshalObject(CollectionMarshaller.java:41) at org.grails.web.converters.marshaller.json.CollectionMarshaller.marshalObject(CollectionMarshaller.java:30) at grails.converters.JSON.value(JSON.java:184) at grails.converters.JSON.convertAnother(JSON.java:144) at org.grails.web.converters.marshaller.json.GroovyBeanMarshaller.marshalObject(GroovyBeanMarshaller.java:67) at org.grails.web.converters.marshaller.json.GroovyBeanMarshaller.marshalObject(GroovyBeanMarshaller.java:39) at grails.converters.JSON.value(JSON.java:184) at grails.converters.JSON.convertAnother(JSON.java:144) at org.grails.web.converters.marshaller.json.MapMarshaller.marshalObject(MapMarshaller.java:45) at org.grails.web.converters.marshaller.json.MapMarshaller.marshalObject(MapMarshaller.java:30) at grails.converters.JSON.value(JSON.java:184) at grails.converters.JSON.convertAnother(JSON.java:144) at org.grails.web.converters.marshaller.ClosureObjectMarshaller.marshalObject(ClosureObjectMarshaller.java:61) at grails.converters.JSON.value(JSON.java:184) at grails.converters.JSON.convertAnother(JSON.java:144) at org.grails.web.converters.marshaller.json.CollectionMarshaller.marshalObject(CollectionMarshaller.java:41) at org.grails.web.converters.marshaller.json.CollectionMarshaller.marshalObject(CollectionMarshaller.java:30) at grails.converters.JSON.value(JSON.java:184) at grails.converters.JSON.convertAnother(JSON.java:144) at org.grails.web.converters.marshaller.json.MapMarshaller.marshalObject(MapMarshaller.java:45) at org.grails.web.converters.marshaller.json.MapMarshaller.marshalObject(MapMarshaller.java:30) at grails.converters.JSON.value(JSON.java:184) at grails.converters.JSON.render(JSON.java:119) at grails.converters.JSON.render(JSON.java:132) at org.grails.compiler.web.converters.RenderConverterTrait$Trait$Helper.render(RenderConverterTrait.groovy:22) at com.goglides.ListingController.feature(ListingController.groovy:17) ... 52 common frames omitted Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: -1 at java.lang.AbstractStringBuilder.substring(AbstractStringBuilder.java:935) at java.lang.StringBuilder.substring(StringBuilder.java:76) at grails.converters.JSON.handleCircularRelationship(JSON.java:341) at grails.converters.JSON.value(JSON.java:176) at grails.converters.JSON.convertAnother(JSON.java:144) at org.grails.web.converters.marshaller.json.GenericJavaBeanMarshaller.marshalObject(GenericJavaBeanMarshaller.java:66)


Solution

  • Does your plugin use new RestBuilder() from org.grails:grails-datastore-rest-client plugin? Then you are most likely triggering this bug in Grails. I just tripped over that problem again in our code :-(

    Workaround: you'll have to rewrite your plugin code to look like this:

    RestBuilder rest = new RestBuilder(
            ...
            // workaround for https://github.com/grails/grails-data-mapping/issues/864
            registerConverters: false
        )
    

    CAVEAT if your code relies on the converters being available for the body content, then you'll have to rewrite your code to handle the conversion manually. I.e. from

    new RestBuilder(...)
        .put(...) {
            ...
            body object as JSON
        }
    

    to

    String json = (object as JSON).toString()
    new RestBuilder(
            ...
            // workaround for https://github.com/grails/grails-data-mapping/issues/864
            registerConverters: false
        )
        .put(...) {
            ...
            body json
        }