问题与杰克逊json映射多态和循环引用

时间:2014-06-04 05:11:34

标签: java javascript json jackson

到目前为止,我还没有找到解决此问题或遇到同样问题的人:我无法提交代码,但会尝试用图解释并尽可能清楚。

A类指向抽象B.具体类C然后指向A. A和B有db生成的ID,C,D和E继承id形式B.C,D,E上的id仍然是唯一的所有这些。

enter image description here

很明显,在这种情况下不能使用@JsonManagedReference和@JsonBackReference,因为B是多态的。这种情况是注释的一个限制。

我试图在C中使用@JsonIdentityReference(alwaysAsId = true)(它指向A)并且它导致C只有预期的A的ID,并且没有问题序列化它,但是在反序列化时它可能会抛出着名的" 无法解析对象ID .... - 未解析的前向参考?"。

有人有解决方案,或者看到某个可能有用的示例吗?

1 个答案:

答案 0 :(得分:0)

所以我毕竟能够解决这个问题而不是Jackson的任何帮助,但使用递归格式方法和递归removeDuplicateNodes()方法。

  • 格式方法将删除附加到每个节点(A,B,C,D,E)的额外UI相关信息。
  • 它还复制链接到任何节点C的任何节点A.换句话说,它扩展了C上的节点A.即,节点C将自己具有节点A的完整描述。节点A也有自己的完整描述。

一旦完成格式化,就可以按照没有前向引用的方式删除重复。因此,从根节点开始,我们将执行以下操作:

  • 如果节点A上有指向A *的C,那么将仅用其ID替换A *的完整描述。
  • 如果节点A上没有C,那么我们就不在乎了。

发生的事情是,首先我们将所有节点扩展为完整描述而不仅仅是id。然后递归地将完整描述替换为之前在C节点上描述的任何A节点的id。

希望这有助于其他人。