2012-11-29 22 views
8

私は自分のエンティティで双方向の多対多の関係を持っています。双方向多対多関係の循環参照

public class Collaboration { 

    @JsonManagedReference("COLLABORATION_TAG") 
    private Set<Tag> tags; 

} 

public class Tag { 

    @JsonBackReference("COLLABORATION_TAG") 
    private Set<Collaboration> collaborations; 

} 

私はJSONにこれをシリアル化しようとすると、私は次の例外を取得しています:: `

は「java.lang.IllegalArgumentExceptionが:管理/バック 扱うことができない以下の例を参照してください。参照「COLLABORATION_TAG」:マネージ型(foo.Collaboration)と 互換性のないバックの参照型(java.util.Set)

javadocが明示的に述べているので実際には、私は、これは理にかなって知っています。コレクションで@JsonBackReferenceを使用することはできません。私の質問は、私はこの問題にどのように対処すべきですか?私が今行ったことは、親サイドの@JsonManagedReferenceアノテーションを削除し、子サイドに@JsonIgnoreを追加したことです。誰かがこのアプローチの副作用を教えてもらえますか?他の提案はありますか?

+2

あなたはジャクソン2.0を使用することができますに

@Entity @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id") public class Collaboration { .... 

ようジャクソン2ライブラリで提供されます。 http://stackoverflow.com/questions/10065002/jackson-serialization-of-entities-with-birectional-relationships-avoiding-cycを参照してください。 –

+1

「JsonIdentityInfo」アノテーションは素敵です。感謝します。@EugeneRetunsky!私はこのページがどのように動作するかを知るのに非常に有用であることを発見しました:http://wiki.fasterxml.com/JacksonFeatureObjectIdentity –

+0

'JsonManagedReference'と' JsonBackReference'を試しました どれも動作しません。 しかし、@SimonAndréForsbergのリンクは非常に興味深く、動作します。 – yas

答えて

3

私は次のソリューションを実装しました。

この関係の一端は親とみなされます。ジャクソン関連のアノテーションは必要ありません。

public class Collaboration { 

    private Set<Tag> tags; 

} 

もう一方の関係は次のように実装されています。

public class Tag { 

    @JsonSerialize(using = SimpleCollaborationSerializer.class) 
    private Set<Collaboration> collaborations; 

} 

私は循環参照が発生しないことを確認しますし、カスタム・シリアライザを使用しています。シリアライザは次のように実装できます。

public class SimpleCollaborationSerializer extends JsonSerializer<Set<Collaboration>> { 

    @Override 
    public void serialize(final Set<Collaboration> collaborations, final JsonGenerator generator, 
     final SerializerProvider provider) throws IOException, JsonProcessingException { 
     final Set<SimpleCollaboration> simpleCollaborations = Sets.newHashSet(); 
     for (final Collaboration collaboration : collaborations) { 
      simpleCollaborations.add(new SimpleCollaboration(collaboration.getId(), collaboration.getName()));     
     } 
     generator.writeObject(simpleCollaborations); 
    } 

    static class SimpleCollaboration { 

     private Long id; 

     private String name; 

     // constructors, getters/setters 

    } 

} 

このシリアライザは、コラボレーションエンティティのプロパティのうち、限定されたセットのみを表示します。 「tags」プロパティは省略されているため、循環参照は発生しません。

このトピックに関するよくあるお問い合わせはhereです。これは、同様のシナリオを実行しているときにすべての可能性を説明します。

+0

私はsimilalrの状況をhttp://stackoverflow.com/questions/28179369/spring-rest-json-can-not-handle-managed-back-reference-defaultreference-415で説明しました 私はまだそれを見つけることができませんでしたアノテーションを使用した直接的なソリューション – zencv

1

非常に便利なインタフェースの実装は、Mavenの

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-core</artifactId> 
    <version>2.0.2</version> 
</dependency> 
+0

FYI:正しい依存関係は ' jackson-annotations'であるべきだと思います。とにかくそれは私のビルドのために働いたものです。 – FrustratedWithFormsDesigner

関連する問題