如何在对象引用自身时解决“杰克逊 - 双向关系”

时间:2018-01-28 13:28:36

标签: spring rest jackson

我正面临“无限递归(StackOverflowError)”错误 并遵循本手册:http://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion我试图在我的情况下解决它,但它似乎不同,因为在我的情况下,对象指向自己。

我的意思是,我有这个对象:

public class PRBOperatorId implements Serializable {
private static final long serialVersionUID = 1L;

public PRBOperatorType type = null;

public PRBOperatorId parentId = null;

public PRBOperatorId childId = null;

public String name = null;
public String[] formats = null;
public String description = null;
public String[] examples = null;
public String returnedFormat = null;
public String comments = null;

服务正在使用它来使用递归方法获取根运算符的所有运算符:

@Override
public PRBOperatorId[] getAllChildren() {
    LinkedList<PRBOperatorId> list = new LinkedList<PRBOperatorId>();
    return getAllChildrenRec(operatorsRoot.getId(), list).toArray(new PRBOperatorId[list.size()]);
}

public Collection<PRBOperatorId> getAllChildrenRec(PRBOperatorId rootId, LinkedList<PRBOperatorId> childrenIds) {
    try {......

我不是通过java对象映射数据库表(我实际上没有对象之间的一对多关系),我只是试图创建一个Spring休息控制器而不是我在服务。

我该如何解决?

感谢。

1 个答案:

答案 0 :(得分:0)

你告诉杰克逊如何识别物体吗?因为如果你这样做,即使对象指向自身也没有处理循环引用的问题。

@JsonIdentityInfo(
      generator = ObjectIdGenerators.PropertyGenerator.class, 
      property = "name")
public static class PRBOperatorId implements Serializable
{
    private static final long serialVersionUID = 1L;

    public PRBOperatorId parentId = null;

    public PRBOperatorId childId = null;

    public String name = null;
}

public static void main(String[] args) {
    PRBOperatorId op = new PRBOperatorId();
    op.parentId = op;
    op.childId = op;
    op.name = "aaa";
    try {
    ObjectMapper mapper = new ObjectMapper();
    mapper.writeValue(System.out, op);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

输出:

{"name":"aaa","parentId":"aaa","childId":"aaa"}