(4.0.3b)Google App Engine
と一緒に使用している Android アプリのバックエンドを提供します。Objectify
バックエンドには、 (友達)関係を持つ単純なUser
エンティティがあります。list of Users
@Entity
public class User {
@Id
private String email;
@Load
private List<Ref<User>> friends = new ArrayList<Ref<User>>();
private User() {
}
public List<User> getFriends() {
ArrayList<User> friendList = new ArrayList<User>();
for (Ref<User> ref : this.friends) {
friendList.add(ref.get());
}
return friendList;
}
public void setFriends(List<User> friends) {
List<Ref<User>> refs = new ArrayList<Ref<User>>();
for (User user : friends) {
refs.add(Ref.create(user));
}
this.friends = refs;
}
}
たとえば、次のユーザーがデータベースに保存されている場合:user1
およびuser2
:
user1
がuser2
友達リストにいる、またはその逆
エンドポイントからUser オブジェクト (上記のサイクル参照を持つ) をフェッチしようとすると、Android クライアントは次の例外をスローします。
com.google.appengine.repackaged.org.codehaus.jackson.map.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: java.util.ArrayList[0]...
この投稿Infinite Recursion with Jackson JSON and Hibernate JPA issue@JsonIgnore
では、フィールドまたは getter/setter メソッドでの使用を推奨しています。しかし、クライアント側では、(生成されたクライアント ライブラリ オブジェクトから) これらのゲッター/セッター メソッドによってフレンド リストにアクセスする必要があるため、これは役に立ちません。
もう 1 つのヒントは、 @JsonManagedReference と @JsonBackReference を使用することです。これは、私の場合は適用できず、同じフィールドを指すためです。ManagedReference
BackReference
friends
私の問題を解決できると思うのは@JsonIdentityInfo Annotation ですJackson 2.0
。
私の問題は、Google App Engine でこのアノテーションを使用する方法がわからないことです。GAE は を使用しますがjackson-core-asl-1.9.11
、残念ながら はありません。これは@JsonIdentityInfo
明らかに 2.0 未満のバージョンに依存しているためです。
Google App Engine で最新の Jackson バージョン (2.4) を使用して @JsonIdentityInfo 機能を使用する方法を知っている人はいますか?
または、私の問題に対するより良いアプローチがありますか?