当前位置: 首页 > 知识库问答 >
问题:

JsonMappingException:云endpoint中的无限递归

阳兴朝
2023-03-14

我使用Google Endpoint创建了一个应用服务器,它是一个即时消息应用程序的后端。每个用户都有一个好友列表。

当我创建一个新朋友时,我使用下面的方法将用户添加到彼此的朋友列表中。然而,由于循环依赖关系,当我添加朋友时,它给了我以下错误。

我看了贴出的其他问题和解决方案。他们中的大多数人结构不同,他们没有解决我的问题。

这个网站的一个答案是建议添加@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个答案

袁运锋
2023-03-14

听起来这个问题是:“如何通过云endpoint返回具有循环的数据结构?”

如果它使用vanilla Jackson(从stacktrace的外观来看是Jackson 1.x)序列化数据,则不能。Jackson 2支持JSOG,但这意味着放弃云endpoint:

  • https://github.com/jsog/jsog
 类似资料:
  • 我得到了错误下的无限递归。 下面是我的代码 另一个班 我无法理解为什么在UI上获取此值时会出现此错误。

  • 我从本例中的createDataFrame调用中获得了一个StackOverflow Error。它起源于涉及java类型推理的scala代码,该代码在无限循环中调用自己。 堆栈跟踪的底部如下所示: 这与中报告的错误类似http://apache-spark-developers-list.1001551.n3.nabble.com/Stackoverflow-in-createDataFrame

  • 问题内容: 我的IDE给我该行的错误 我试着抓住,但是并没有使错误消失。有什么想法吗? 问题答案: 扩展了,所以您的IDE本身就有了更深的麻烦-也许库导入被搞砸了?

  • 我用的是Spring Roo 1.2.1和Jackson 1.9.7。在使用json序列化我的类时,我得到了一个JsonMappingException。 我读了以下帖子,但没有找到适合我的工作解决方案: Jackson的无限递归 Jackson-具有双方向关系的实体序列化(避免循环) 我不知道为什么JsonIgnore在属性QueueOuts的类Queue中不起作用。我也尝试了JsonManag

  • 我在程序的某个部分遇到了问题,我将一个充当lambda函数的对象传递给另一个函数(我需要捕获一个常量this指针,这样我就不能使用实际的lambda)。这导致调用lambda的copy构造函数,该构造函数再次调用copy构造函数,最终堆栈溢出。我知道发生了什么,但我不知道复制构造函数为什么调用自己,也不知道如何解决这个问题。我复制了下面的问题。 编译器:MSVC 2010

  • 在尝试执行GET到发布者存储库时,我正在执行GET和无限循环。 出版商: 书: 完整代码可在此处获得: https://github.com/vanyasav/library