使用jackson将ebean映射到json时,如何避免无限循环引用?

时间:2012-11-09 19:44:30

标签: java json playframework-2.0 ebean

我目前正在使用Play! 2.0.4与Ebean和Jackson合作。我在User和Contact之间有一个OneToMany关系。我正在使用Jacksons ObjectMapper将对象转换为json,但我在转换过程中遇到了循环引用的问题。

class User extends Model {
    List<Contact> contacts;
}

class Contact extends Model {
    User user;
}

我想获取所有联系人的列表,并将此列表转换为json,包括将其链接到用户的外键,但不需要User表本身的任何数据。

目前我在使用ObjectMapper创建此列表时遇到StackOverflowError。我理解为什么,但不知道如何最好地解决它。

我省略了我认为不相关的任何注释和代码,但如果需要更多代码,请告诉我。

2 个答案:

答案 0 :(得分:2)

我没有使用Play框架,但JPA允许您将OneToMany或ManyToMany关系从一个实体映射到另一个实体。然后在第二个实体中,它向后读取相同的关系,因此只有一个关系。你的问题听起来像是你有两种关系,一种是单向关系。

在User类中查找与@OneToMany相同的Play eBean(mappedBy =“user”)。

答案 1 :(得分:0)

也许您需要获取List o结果,迭代它并创建仅包含所需数据的新List。我不确定ObjectMapper,但是我有similar problem并且似​​乎toJson()方法强制构建具有所有关系的整个对象。

从那个问题开始,我构建了一些JSON API并记住了这段经历,我决定为每一行手动构建新对象。我的一些API可以(应该)返回大型数据集,因此仔细选择数据非常重要,没有冗余(未使用)字段等。像这样

public static Result jsonAll(){

    // initiate empty result List
    List results = new ArrayList();

    List<Marker> tasks = Marker.find.select("id, name").findList();
    for (Marker task : tasks) {

        // build 'item'
        Map<String, Object> item = new HashMap<String, Object>();
        item.put("id", task.id);
        item.put("name", task.name);

        // add the 'item' to 'results'
        results.add(item);

    }

    // return all as JSON
    return ok(Json.toJson(results));
}

当然,您需要获取关系,因此您需要将fetch() statement添加到查找程序并指出要选择的确切关系和字段。