Java com.google.appengine.repackage.org.codehaus.jackson.map.JsonMappingException,同时实现一对多双向关系应用程序引擎

Java com.google.appengine.repackage.org.codehaus.jackson.map.JsonMappingException,同时实现一对多双向关系应用程序引擎,java,android,json,google-app-engine,google-cloud-datastore,Java,Android,Json,Google App Engine,Google Cloud Datastore,我想为我的应用程序引擎应用程序实现一对多双向关系。以下是我的实体: @Entity public class UserMaster { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Key key; private String userName; @OneToMany(mappedBy = "user") List<FeedMaster> feeds;

我想为我的应用程序引擎应用程序实现一对多双向关系。以下是我的实体:

@Entity
public class UserMaster {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Key key;
    private String userName;

    @OneToMany(mappedBy = "user")
    List<FeedMaster> feeds;

    getter()...setter() for all properties
}

@Entity
public class FeedMaster {
     @Id
    private String feedId;

    @ManyToOne(fetch = FetchType.LAZY)
    UserMaster user;

   getter()....setter() for both properties
}

我搜索了很多,但找不到任何解决方案。我在这里提到过,他们说要删除
FeedMaster
UserMaster
的getter setter,但是如果我删除了它,那么我将无法通过
FeedMaster
对象访问
UserMaster
数据。请帮我解决这个问题。谢谢。

这里发生的事情是Jackson库发现了一个无法转换为JSON的循环。在返回此对象时,您必须决定在哪里返回关系,在哪里不返回关系

您的代码意味着您可以从
UserMaster
访问
FeedMaster
,也可以从
FeedMaster
访问
UserMaster
。这在您的应用程序级别上是非常好的,但是当您将这个对象图序列化为JSON时,您将不得不放弃其中一个关系,因为它将导致JSON表示上的无休止的循环

为此,您可以使用
@JsonIgnore
注释,如下所示:

import com.fasterxml.jackson.annotation.JsonIgnore; 

@Entity
public class FeedMaster {
   @Id
   private String feedId;

   @ManyToOne(fetch = FetchType.LAZY)
   UserMaster user;

   @JsonIgnore
   public UserMaster getUser() {
      ...
   }
}

在这种情况下,您的JSON将允许您访问
UserMaster
中的所有
FeedMaster
对象,但不能访问
FeedMaster
中的
UserMaster
对象。您可能已经了解到这一点,但有一种可能性是您正在使用“key”作为您的@Id的成员字段名。在过去几个小时里,我已经阅读了appengine上的4-5个不同教程,并记得他们在某个地方特别指出不要使用“key”这个词作为您的key,因为它与内部数据存储impl相冲突。(我在这个线程上结束的方式是,我正试图找出JsonMappingException的另一个问题,关于这些错误的资源太少了…)

试着改变

private Key key;

看看这能不能解决问题

private Key key;
private Key k; // obv use a better name such as id for real code (though k may be a reasonable convention in your codebase