2012-03-02 10 views
2

要約:@JsonTypeInfoも使用される多態型の双方向参照を処理する方法はありますか?多態型とJSONを使用して双方向参照を処理する方法は?

this page状態なしの下部にあるノートが、それは2010年に書かれたと私は多分何かが変更されたか、誰かが別のアプローチを提案することができます願っていますので、ジャクソンV1.6.0に適用しました。

背景: 私はジャクソンライブラリーとJPAを使用してJsonMappingException: Infinite recursion、エラーを取得しています。私は@JsonIgnoresuggested hereと追加できますが、JPAエンティティがシリアル化/逆シリアル化されたときに双方向の関連付けが失われてしまうという欠点があります。

ジャクソンv1.6.0は、と@JsonBackReferenceアノテーションを導入しました。これは素晴らしいようですが、2010年のdocumentationには、@JsonTypeInfoを使用した多態性処理ではこれらの注釈が機能しないと具体的に述べられています。以下は

は私のエンティティクラスの不自然な例です:

@Entity 
public class Owner implements Serializable { 

    @Id 
    @GeneratedValue 
    @Column(name="owner_id") 
    private Long id; 

    @OneToMany(mappedBy="pet", orphanRemoval=true, cascade=CascadeType.ALL) 
    private List<Pet> pets; 

    public List<Pet> getPets() {return pets;} 
    public void setPets(List<Pet> pets) {this.pets = pets;} 
} 

@Entity 
@DiscriminatorColumn(name="pet_type") 
@JsonTypeInfo( 
     use = JsonTypeInfo.Id.NAME, 
     include = JsonTypeInfo.As.PROPERTY, 
     property = "type") 
    @JsonSubTypes({ 
     @Type(value = Dog.class, name = "dog"), 
     @Type(value = Cat.class, name = "cat"), 
     @Type(value = Bird.class, name = "bird") }) 
public class Pet implements Serializable { 

    @Id 
    @GeneratedValue 
    @Column(name="pet_id") 
    private Long id; 

    @ManyToOne 
    @JoinColumn(name="owner_id") 
    private Owner owner; 

    //@JsonIgnore 
    public Owner getOwner() {return owner;} 
    public void setOwner(Owner owner) {this.owner = owner;} 
} 

答えて

2

これはすぐに解決策はありませんが、ジャクソン2.0.0は最終的に@JsonIdentityInfo注釈を使用して、完全なオブジェクトIDの処理をサポートしています。 ドキュメントはまだ進行中です(ページはthis)。ユニットテストにはまともな例があります。

アイデアは、オブジェクトIDが必要なタイプ(または、プロパティを示す)を指定することです。用途は@JsonTypeInfoのものと非常に似ています。

ジャクソンはRC1が一週間前にリリースされた2.0.0、そして希望は、最終的な2.0.0は2012年3月の提案のための

+0

感謝の終了前に出て行くべきであるということです。確かめます – Justin

関連する問題