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



我的grails应用程序中有Marshaller,它运行良好,但是在我将插件集成到我的应用程序中后,它抛出了错误。错误如下:

由以下原因引起:org.grails.web.converters.exceptions.ConverterException: 使用类转换 Bean 时出错 org.hibernate.persister.entity.SingleTableEntityPersister at org.grails.web.converters.marshaller.json.GenericJavaBeanMarshaller.marshalObject(GenericJavaBeanMarshaller.java:84) 在 org.grails.web.converters.marshaller.json.GenericJavaBeanMarshaller.marshalObject(GenericJavaBeanMarshaller.java:39) at grails.converters.JSON.value(JSON.java:184) at grails.converters.JSON.convertOther(JSON.java:144) at org.grails.web.converters.marshaller.json.MapMarshaller.marshalObject(MapMarshaller.java:45) 在 org.grails.web.converters.marshaller.json.MapMarshaller.marshalObject(MapMarshaller.java:30) at grails.converters.JSON.value(JSON.java:184) at grails.converters.JSON.convertOther(JSON.java:144) at org.grails.web.converters.marshaller.json.GenericJavaBeanMarshaller.marshalObject(GenericJavaBeanMarshaller.java:66) 在 org.grails.web.converters.marshaller.json.GenericJavaBeanMarshaller.marshalObject(GenericJavaBeanMarshaller.java:39) at grails.converters.JSON.value(JSON.java:184) at grails.converters.JSON.convertOther(JSON.java:144) at org.grails.web.converters.marshaller.json.GenericJavaBeanMarshaller.marshalObject(GenericJavaBeanMarshaller.java:66) 在 org.grails.web.converters.marshaller.json.GenericJavaBeanMarshaller.marshalObject(GenericJavaBeanMarshaller.java:39) at grails.converters.JSON.value(JSON.java:184) at grails.converters.JSON.convertOther(JSON.java:144) at org.grails.web.converters.marshaller.json.GenericJavaBeanMarshaller.marshalObject(GenericJavaBeanMarshaller.java:66) 在 org.grails.web.converters.marshaller.json.GenericJavaBeanMarshaller.marshalObject(GenericJavaBeanMarshaller.java:39) at grails.converters.JSON.value(JSON.java:184) at grails.converters.JSON.convertOther(JSON.java:144) at org.grails.web.converters.marshaller.json.GroovyBeanMarshaller.marshalObject(GroovyBeanMarshaller.java:67) 在 org.grails.web.converters.marshaller.json.GroovyBeanMarshaller.marshalObject(GroovyBeanMarshaller.java:39) at grails.converters.JSON.value(JSON.java:184) at grails.converters.JSON.convertOther(JSON.java:144) at org.grails.web.converters.marshaller.json.MapMarshaller.marshalObject(MapMarshaller.java:45) 在 org.grails.web.converters.marshaller.json.MapMarshaller.marshalObject(MapMarshaller.java:30) at grails.converters.JSON.value(JSON.java:184) at grails.converters.JSON.convertOther(JSON.java:144) at org.grails.web.converters.marshaller.json.GroovyBeanMarshaller.marshalObject(GroovyBeanMarshaller.java:67) 在 org.grails.web.converters.marshaller.json.GroovyBeanMarshaller.marshalObject(GroovyBeanMarshaller.java:39) at grails.converters.JSON.value(JSON.java:184) at grails.converters.JSON.convertOther(JSON.java:144) at org.grails.web.converters.marshaller.json.GroovyBeanMarshaller.marshalObject(GroovyBeanMarshaller.java:67) 在 org.grails.web.converters.marshaller.json.GroovyBeanMarshaller.marshalObject(GroovyBeanMarshaller.java:39) at grails.converters.JSON.value(JSON.java:184) at grails.converters.JSON.convertOther(JSON.java:144) at org.grails.web.converters.marshaller.json.CollectionMarshaller.marshalObject(CollectionMarshaller.java:41) 在 org.grails.web.converters.marshaller.json.CollectionMarshaller.marshalObject(CollectionMarshaller.java:30) at grails.converters.JSON.value(JSON.java:184) at grails.converters.JSON.convertOther(JSON.java:144) at org.grails.web.converters.marshaller.json.GroovyBeanMarshaller.marshalObject(GroovyBeanMarshaller.java:67) 在 org.grails.web.converters.marshaller.json.GroovyBeanMarshaller.marshalObject(GroovyBeanMarshaller.java:39) at grails.converters.JSON.value(JSON.java:184) at grails.converters.JSON.convertOther(JSON.java:144) at org.grails.web.converters.marshaller.json.CollectionMarshaller.marshalObject(CollectionMarshaller.java:41) 在 org.grails.web.converters.marshaller.json.CollectionMarshaller.marshalObject(CollectionMarshaller.java:30) at grails.converters.JSON.value(JSON.java:184) at grails.converters.JSON.convertOther(JSON.java:144) at org.grails.web.converters.marshaller.json.GroovyBeanMarshaller.marshalObject(GroovyBeanMarshaller.java:67) 在 org.grails.web.converters.marshaller.json.GroovyBeanMarshaller.marshalObject(GroovyBeanMarshaller.java:39) at grails.converters.JSON.value(JSON.java:184) at grails.converters.JSON.convertOther(JSON.java:144) at org.grails.web.converters.marshaller.json.MapMarshaller.marshalObject(MapMarshaller.java:45) 在 org.grails.web.converters.marshaller.json.MapMarshaller.marshalObject(MapMarshaller.java:30)at grails.converters.JSON.value(JSON.java:184) at grails.converters.JSON.convertOther(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.convertOther(JSON.java:144) at org.grails.web.converters.marshaller.json.CollectionMarshaller.marshalObject(CollectionMarshaller.java:41) 在 org.grails.web.converters.marshaller.json.CollectionMarshaller.marshalObject(CollectionMarshaller.java:30) at grails.converters.JSON.value(JSON.java:184) at grails.converters.JSON.convertOther(JSON.java:144) at org.grails.web.converters.marshaller.json.MapMarshaller.marshalObject(MapMarshaller.java:45) 在 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) 在 com.goglides.ListingController.feature(ListingController.groovy:17) ...省略 52 个常见帧 原因如下: java.lang.StringIndexOutOfBoundsException: String index 超出范围: -1 at java.lang.AbstractStringBuilder.substring(AbstractStringBuilder.java:935) at java.lang.StringBuilder.substring(StringBuilder.java:76) at grails.converters.JSON.handleCircularRelations(JSON.java:341) at grails.converters.JSON.value(JSON.java:176) at grails.converters.JSON.convertOther(JSON.java:144) at org.grails.web.converters.marshaller.json.GenericJavaBeanMarshaller.marshalObject(GenericJavaBeanMarshaller.java:66)

您的插件是否使用org.grails:grails-datastore-rest-client插件中的new RestBuilder()?那么你很可能在Grails中触发了这个错误。我只是在我们的代码中再次绊倒了这个问题:-(

解决方法:您必须重写插件代码,使其如下所示:

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

警告如果您的代码依赖于可用于正文内容的转换器,那么您必须重写代码以手动处理转换。 即从

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
}

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

通过将new RestBuilder()更改为使用new RestBuilder(registerConverters: false)来解决,这似乎为我们解决了这个问题。

最新更新