1

GAE サーバー + Objectify DB と通信する Android アプリケーションを開発しています。

残りのフレームワークには Restlet を選択します。

キー属性を持つエンティティを取得しようとすると問題が発生します。サーバーはエラーをスローします:

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のキーには、祖先チェーンのルート要素を返す便利なメソッドgetRoot()があります。キールートの場合、getRoot()はこれを返します。ジャクソンはこれをサイクルとして検出するため、エラーが発生します。

これに対処する最善の方法は、キーをjsonオブジェクトとしてシリアル化しようとしないことです。キーは、文字列化されたバージョンとしてJSONではるかによく表されます。

Restletでこれを行う方法はわかりませんが、ObjectMapperインスタンスを変更して、この変換を行うKeySerializerを提供する必要があります。ObjectifyJacksonModuleガイダンスについては、Objectify4をご覧ください。

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 に答える