我使用Google终端创建了一个应用服务器,它是即时通讯应用的后端。每个用户都有一个朋友列表。
当我创建新朋友时,我使用以下方法将用户添加到彼此的朋友列表中。但是,由于循环依赖性,当我添加好友时,它会给我以下错误。
我查看了其他问题和解决方案。他们中的大多数结构不同,他们没有解决我的问题。
本网站的一个答案建议添加@JSONIgnore
,但我没有添加任何字段。我试图放@JsonManagedReference
,但我无法弄清楚放置@JSONBackReference
的位置。本网站上的其他示例通常有另一个引用父母的字段,但我没有。
提前感谢您的帮助。
Error 500 com.google.appengine.repackaged.org.codehaus.jackson.map.JsonMappingException:
Infinite recursion (StackOverflowError) (through reference chain: com.google.common.collect.TransformingRandomAccessList[0]-
>com.net.myapplication.backend.model.User[\"friends\"]->com.google.common.collect.TransformingRandomAccessList[0]-
>com.net.myapplication.backend.model.User[\"friends\"]-
addFriend方法
@ApiMethod(name = "addFriend", httpMethod = "post")
public User addFriend(@Named("regId") String regId, @Named("email") String email) {
User user = findRecord(regId);
User friend = findRecordByEmail(email);
if (user == null){
log.info("User " + regId + " is not registered.");
} else{
if (friend == null){
log.info("User " + email + " is not registered.");
} else{
if (hasFriend(user, friend)){
log.info("User " + email + " is already a friend.");
} else {
user.getFriendsRef().add(Ref.create(friend));
friend.getFriendsRef().add(Ref.create(user));
ofy().save().entity(friend).now();
ofy().save().entity(user).now();
return friend;
}
}
}
return null;
}
用户模型
@Entity
public class User {
@Id
Long id;
@Index
private String regId;
private String firstName;
private String lastName;
@Index
private String email;
private Language language;
@Load
private List<Ref<User>> friends = new ArrayList<>();
public User() {}
public User(Long id, String regId, String firstName, String lastName, String email, Language language, List<Ref<User>> friends) {
this.id = id;
this.regId = regId;
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
this.language = language;
this.friends = friends;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getRegId() {
return regId;
}
public void setRegId(String regId) {
this.regId = regId;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Language getLanguage() {
return language;
}
public void setLanguage(Language language) {
this.language = language;
}
public List<User> getFriends() {
return Deref.deref(friends);
}
@ApiResourceProperty(ignored = AnnotationBoolean.TRUE)
public List<Ref<User>> getFriendsRef(){
return friends;
}
public void setFriends(ArrayList<Ref<User>> friends) {
this.friends = friends;
}
}
答案 0 :(得分:0)
听起来这个问题是:&#34;如何通过云端点返回带循环的数据结构?&#34;
如果它与香草杰克逊(杰克逊1.x,从该堆栈跟踪的外观)序列化数据,你就不能。 Jackson 2支持JSOG,但这意味着放弃Cloud Endpoints: