9

私は自分のエンティティで双方向の多対多の関係を持っています。以下の例を参照してください。

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'を処理できません:バックリファレンスタイプ(java.util.Set)はマネージドタイプ(foo.Collaboration)と互換性がありません。

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

4

2 に答える 2

4

最終的に次のソリューションを実装しました。

関係の一方の端が親と見なされます。ジャクソン関連の注釈は必要ありません。

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」プロパティが省略されているため、循環参照は発生しません。

このトピックについての良い読み物はここで見つけることができます。あなたが同様のシナリオを持っているとき、それはすべての可能性を説明します。

于 2013-02-14T15:50:20.887 に答える
1

非常に便利なインターフェースの実装は、jackson2ライブラリで次のように提供されます。

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

Mavenで

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.0.2</version>
</dependency>
于 2015-03-07T00:45:44.963 に答える