2017-03-07 2 views
0

私はDropwizardとSwaggerを使用して、さまざまなオブジェクトへのアクセスを管理するREST APIを作成しています。これらの2つのオブジェクトは、例えば、多対多の関係に関与している:再帰なしでDropwizard/Hibernate/Swaggerで多対多の関係で子オブジェクトを返すにはどうすればよいですか?

# Tricks: 
[{ id: 1, name: 'Roll over' }, 
{ id: 2, name: 'Play dead' }, 
{ id: 3, name: 'Steal second' }] 

# Puppies: 
[{ id: 1, name: 'Flopsy' }, 
{ id: 2, name: 'Mopsy' }, 
{ id: 3, name: 'Cottontail' }] 

# Puppies_Tricks 
[{ puppy_id: 1, trick_id: 1 }, 
{ puppy_id: 1, trick_id: 2 }, 
{ puppy_id: 2, trick_id: 2 }, 
{ puppy_id: 2, trick_id: 3 }] 

だから私は/子犬をGET/1 I:

public class Puppy implements Serializable { 
    private Long id; 
    private String name; 
    @ManyToMany(targetEntity = Trick.class) 
    @JoinTable(
     name="puppies_tricks", 
     [email protected](name="puppy_id"), 
     [email protected](name="trick_id")) 
    private List<Trick> tricks; 

    @JsonProperty("tricks") 
    public List<Trick> getTricks() { return this.tricks; } 
    ... 
}  

public class Trick implements Serializable { 
    private Long id; 
    private String name; 
    @ManyToMany(targetEntity = Puppy.class) 
    @JoinTable(
     name="puppies_tricks", 
     [email protected](name="trick_id"), 
     [email protected](name="puppy_id")) 
    private List<Puppy> puppies; 

    @JsonProperty("puppies") 
    public List<Puppy> getPuppies() { return this.puppies; } 
    ... 
}  

そして、実際のデータを仮定は次のようになります以下のような構造を取得したい:

{ 
    "id": 1, 
    "name": "Flopsy", 
    "tricks": [ 
    { "id": 1, "name": "Roll over"}, 
    { "id": 2, "name": "Play dead" } ] 
} 

が、私は実際に取得していますと、ネストされた配列である:

{ 
    "id": 1, 
    "name": "Flopsy", 
    "tricks": [ 
    { "id": 1, "name": "Roll over", "puppies": [ { "id": 1, "name": "Flopsy" }, ...}, 
    { "id": 2, "name": "Play dead", "puppies": [...] } ] 
} 

ジャクソン/ドロップワイザーに、子犬を貰うときのトリックを降りるのを止めるように指示する方法はありますか?

Dropwizard 1.0.6、Java 1.8。

+1

あなたは説明してもいいですか?子犬を手に入れるまでのトリックで下降を止めてください。逆もありますか?*もう少し(もっと簡単に)してください。 – nullpointer

+0

明確にするための情報が追加されました。本質的な問題は、子犬のために質問するとき、私はその子犬のトリックのリストがほしいと思うので、私は他の子犬がそれぞれのトリックを実行できるリストを見たくないということです。 – Zee

+0

http://stackoverflow.com/a/9768357/25429では、可能なアプローチをまとめたものです。 – zloster

答えて

1

Jacksonは、@JsonManagedReference @JsonBackReferenceアノテーションを使用してオブジェクトグラフのシリアル化をサポートしています。 を参照してください。 simple example hereが見つかります。 は本当にです。使用しているツールのドキュメントをよく読んでください。

どのようなアプローチが利用可能であるかはすでにan answer that summarizesです。

0
@JsonIgnore 
@JsonProperty("puppies") 
public List<Puppy> getPuppies() { return this.puppies; } 

はここに私のソリューションは、シリアル化を実装していますが、永続化されていない別のPuppyCoreクラスを作成することでした無限ループに

+0

答えを説明してください。 – Coder

+0

それは意味しますが、それは私がGET/tricks /:idに子犬の対応するリストがないことを意味します。私は実際に欲しい。 別の/ tricks /:id/puppiesエンドポイントを提案して提供するように解決策があると思っています。 – Zee

0

を停止します。これには、Puppyの基本情報(ID、名前)が含まれます。同様に、TrickCoreはIDと名前だけを持っています。

その後パピーはこのゲッターで、セットのトリックが含まれていますTrickCoreオブジェクトのリストを返します

public Set<TrickCore> getTricks(); 

- これらは、子犬のリストを持っている、とそう再帰を停止しないでください。トリックの同様のパターンは、getPuppies()の場合はSet<PuppyCore>を返します。

関連する問題