JsonMappingException:Cloud Endpoints中的无限递归

时间:2015-12-03 22:57:19

标签: google-app-engine jackson google-cloud-endpoints objectify

我使用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;
    }
}

1 个答案:

答案 0 :(得分:0)

听起来这个问题是:&#34;如何通过云端点返回带循环的数据结构?&#34;

如果它与香草杰克逊(杰克逊1.x,从该堆栈跟踪的外观)序列化数据,你就不能。 Jackson 2支持JSOG,但这意味着放弃Cloud Endpoints: