在Json:究竟是什么"直接自我引用"

时间:2012-08-14 17:00:48

标签: java json google-app-engine restlet objectify

问题可能看起来很愚蠢,但对我来说,循环参考是例如对象A引用对象B而对象B引用对象A.

我正在使用一个与具有客观化DB的GAE服务器通信的Android应用程序。

我的模型非常简单,但我收到错误:

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"])

这是我的模型:MyMessage引用MyUser(MyUser DOESNT引用MyMessage ......

以下是代码:

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

@Id
private Long id;

@Unindexed
private String sendMessage;

@Unindexed
private String answerMessage;

private MessageStatus status = MessageStatus.FREE;

@Parent
Key<MyUser> senderKey;

Key<MyUser> answererKey;

@SuppressWarnings("unused")
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;

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

public MyUser(String mail) {
    this.setId(mail);
}

public void setId(String mail) {
    this.id = mail;
}

public String getId() {
    return id;
}

}

那么究竟什么是直接自我引用?我的模型出了什么问题?

谢谢。

1 个答案:

答案 0 :(得分:4)

Key内部包含对父Key的引用,这是对iteslf的引用,即直接自引用。这可能会导致无限循环,因此杰克逊正在抛出错误。

底线:Key不可开箱即用。您可以通过撰写自定义杰克逊来serializer / deserializer来获得。