4

(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

user1user2友達リストにいる、またはその逆

エンドポイントから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 を使用することですこれは、私の場合は適用できず、同じフィールドを指すためです。ManagedReferenceBackReferencefriends

私の問題を解決できると思うのは@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 機能を使用する方法を知っている人はいますか?

または、私の問題に対するより良いアプローチがありますか?

4

1 に答える 1

0

最良のアプローチは、エンドポイントの戻りパラメーターとして使用する DTO クラスを定義し、それを使用して JSON 応答を平坦化することです (つまり、友人の友人の無限ループを送信しないことを意味します)。

于 2015-03-24T17:16:08.317 に答える