json jackson编码 - StackOverflowError

时间:2015-12-09 16:55:15

标签: java json jackson hl7-fhir

我试图将java对象转换为json字符串,并且它因StackoverflowError而失败,可能是因为对象的子对象中有一个无限循环/循环。

    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:152)
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:505)
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:639)
Caused by: java.lang.StackOverflowError
    at java.lang.ClassLoader.defineClass1(Native Method)
...
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:655)

我试图编码的对象是我无法控制的类的实例。我只能继承它。我想我应该可以在犯罪领域添加@JsonIgnore(我的意思是相应的重写getter方法),但我不知道它是哪一个。这些是包含数百个字段和子对象的巨大类。

有没有一种简单的方法可以知道哪个字段导致json编码中的无限循环?

PS:对于那些熟悉它的人来说,它是Hl7 HAPI FHIR框架的Patient类。我知道有一个自定义的json序列化器随附该框架,但我需要使用更通用的jackson来利用它的一些功能。

非常感谢

2 个答案:

答案 0 :(得分:0)

如果对象图具有循环依赖关系,则会发生这种情况。我知道找到循环并不是一种简单的方法。您可以@Ignore所有内容,然后分批重新引入字段,并查看它在哪里中断。

如果您只是使用@Ignore进行子类化注释,那么您应该查看Jackson Mixins

答案 1 :(得分:0)

通常异常应该仍然包括包含图(形成循环的属性的名称);这不是这种情况吗?