3

質問はばかげているように思えるかもしれませんが、私にとって循環参照とは、たとえば、オブジェクト A がオブジェクト B を参照し、かつオブジェクト B がオブジェクト A を参照することです。

objectify 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;
}

}

では、直接自己参照とは正確には何ですか?? 私のモデルの何が問題になっていますか??

ありがとうございました。

4

1 に答える 1

5

Key内部的には、parent への参照が含まれていますKey。これは、タイプごとに itemslf への参照、つまり直接の自己参照です。これは無限ループにつながる可能性があるため、Jackson はエラーをスローしています。

結論:Keyそのままではシリアル化できません。カスタムの Jackson シリアライザー/デシリアライザーを作成することでうまくいくかもしれませ

于 2012-08-14T19:17:47.860 に答える