要为Android应用提供后端,我正在使用Google App Engine
和Objectify
(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;
}
}
现在,当我跟踪存储在数据库中的用户时,例如:user1
和user2
:
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
,因为BackReference
和friends
指向相同的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功能?
或者对我的问题有更好的方法吗?
答案 0 :(得分:0)
最好的方法是定义一个DTO类作为端点的返回参数,并使用它来展平JSON响应(意味着不发送朋友朋友的无限循环)。