JsonMappingException:Objectify中OneToMany关系的无限递归

时间:2014-12-01 00:42:10

标签: android google-app-engine jackson objectify jsonidentityinfo

要为Android应用提供后端,我正在使用Google App EngineObjectify(4.0.3b)。

在后端,我有一个简单的User实体,其中list of Users(朋友)为关系。

@Entity
public class User {

    @Id
    private String email;
    @Load
    private List<Ref<User>> friends = new ArrayList<Ref<User>>();

    private User() {
    }

    public List<User> getFriends() {
        ArrayList<User> friendList = new ArrayList<User>();
        for (Ref<User> ref : this.friends) {
            friendList.add(ref.get());
        }
        return friendList;
    }

    public void setFriends(List<User> friends) {
        List<Ref<User>> refs = new ArrayList<Ref<User>>();
        for (User user : friends) {
            refs.add(Ref.create(user));
        }
        this.friends = refs;
    }

}

现在,当我跟踪存储在数据库中的用户时,例如:user1user2

user1在他的朋友列表中有user2,反之亦然

尝试从我的端点获取User对象(具有上述 周期参考 )时,Android客户端会抛出以下异常:

com.google.appengine.repackaged.org.codehaus.jackson.map.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: java.util.ArrayList[0]...

在这篇文章Infinite Recursion with Jackson JSON and Hibernate JPA issue中,他们建议在字段或getter / setter方法上使用@JsonIgnore。 但在客户端,我需要通过这些getter / setter方法(从生成的客户端库对象)访问好友列表,所以这对我没有帮助。

另一个提示是使用@JsonManagedReference and @JsonBackReference,在我的情况下无法应用ManagedReference,因为BackReferencefriends指向相同的Jackson 2.0字段。

我认为可以解决我的问题的是自jackson-core-asl-1.9.11以来可用的@JsonIdentityInfo注释。

我现在的问题是我不知道如何在Google App Engine中使用此注释。 GAE使用@JsonIdentityInfo,遗憾的是它没有{{1}},因为它显然取决于低于2.0的版本。

有谁知道,我如何使用Google App Engine中的最新Jackson版本(2.4)来使用@JsonIdentityInfo功能?

或者对我的问题有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

最好的方法是定义一个DTO类作为端点的返回参数,并使用它来展平JSON响应(意味着不发送朋友朋友的无限循环)。