Grails 在使用 grails 插件后从 Marshaller 抛出 ConverterException

Grails throws ConverterException from Marshaller after using grails plugin

我的 grails 应用程序中有 Marshaller,它工作正常,但在我的应用程序中集成插件后,它抛出 error.Error 如下:

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)

您使用的是什么插件,它与您使用的 grails 版本兼容吗?您也可以尝试 grails clean 并重新启动。

您的插件是否使用 org.grails:grails-datastore-rest-client 插件中的 new RestBuilder()?那么你很有可能触发this bug in Grails。我刚刚在我们的代码中再次遇到了这个问题:-(

解决方法:您必须将插件代码重写为如下所示:

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

注意事项 如果您的代码依赖于可用于正文内容的转换器,那么您将不得不重写代码以手动处理转换。 IE。来自

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

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