1

我正在开发一个 Android 应用程序,与 GAE 服务器 + Objectify DB 通信。

我选择 Restlet 作为 rest 框架。

当我尝试检索具有 Key 属性的实体时遇到问题。服务器抛出错误:

org.codehaus.jackson.map.JsonMappingException: Direct self-reference leading to cycle
(through reference chain: java.util.ArrayList[0]->com.my.model.MyMessage["senderKey"]->com.googlecode.objectify.Key["root"])

这是我的模型(非常简单):

public class MyMessage implements Serializable {
private static final long serialVersionUID = -1075184303389185795L;

@Id
private Long id;

@Unindexed
private String sendMessage;

@Parent
Key<MyUser> senderKey;

private MyMessage() {
}

public MyMessage(MyUser user, String message) {
    super();
    this.sendMessage = message;
    this.senderKey = new Key<MyUser>(MyUser.class, user.getId());
}

[... getters and setters ...]
}

.

public class MyUser implements Serializable {

private static final long serialVersionUID = 7390103290165670089L;
@Id private String id;

private MyUser() {
    this.setId("default");
}

public MyUser(String mail) {
    this.setId(mail);
}
[... getters and setters ...]

}

我能做些什么来解决这个问题??

4

3 回答 3

2

Objectify 的 Key 有一个方便的方法 getRoot(),它返回祖先链中的根元素。当键根时, getRoot() 返回this。杰克逊将此检测为一个循环,因此您会收到错误消息。

解决这个问题的最好方法是不要尝试将 Keys 序列化为 json 对象。键在 JSON 中更好地表示为字符串化版本。

我不知道你是如何在 Restlet 中做到这一点的,但是你需要修改 ObjectMapper 实例以提供一个 KeySerializer 来进行这种翻译。查看ObjectifyJacksonModuleObjectify4 中的指导:

https://code.google.com/p/objectify-appengine/source/browse/src/com/googlecode/objectify/util/jackson/ObjectifyJacksonModule.java

于 2012-08-21T02:08:30.903 回答
0

你有没有包括

<inherits name="com.googlecode.objectify.Objectify" />

在你的 GWT 模块中?

于 2012-08-16T15:46:33.877 回答
0

我有一个类似的问题导致了这个确切的错误。将代码简化为绝对必需品后,我发现如果我从 AppEngine API 方法返回一个 Key 对象,我将看到此错误。

IE

@ApiMethod(name = "insertPureContainer", path="insertPureContainer", httpMethod = ApiMethod.HttpMethod.POST)
public Key insertPureContainer(PureContainer container, User user) throws OAuthRequestException {

    return ofy().save().entity(container).now();    

}

将导致此错误,返回更新的对象不会。

于 2018-01-13T12:41:00.497 回答