2016-05-23 20 views
0

私は、次のエンティティがありますジャクソン - 自己参照してエンティティをシリアライズ

@Entity 
@Table(name = "registry_entry") 
@JsonIgnoreProperties(ignoreUnknown = true) 
public class RegistryEntry extends GenericEntity { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(unique = true, nullable = false) 
    @JsonProperty("id") 
    protected Long id; 
    ... 
    @ManyToMany(fetch = FetchType.EAGER) 
    @JoinTable(name = "srv_registry_entry_related_dependence", 
    joinColumns = @JoinColumn(name = "id_reg_entry", referencedColumnName = "id"), 
    inverseJoinColumns = @JoinColumn(name = "id_related_reg_entry", referencedColumnName = "id")) 
    @JsonProperty 
    private List<RegistryEntry> relatedRegistryEntries; 
    ... 
} 

たちはB.relatedRegistryEntriesAが含まれており、A.relatedRegistryEntriesBが含まれているエンティティABを持っていると仮定します。

AまたはBをシリアル化しようとすると、私はStackOverflowErrorとなります。このリストのidだけをどのようにシリアル化できますか?

+0

は、おそらくあなたは '@JsonIdentityInfo(発電機= ObjectIdGenerators.IntSequenceGenerator.classを使用することができ、プロパティ=「ID:

より普遍的に互換性のあるアプローチは、自己参照フィールドなしで自己参照オブジェクトをシリアル化することです")'あなたのクラスの上に。または、Listクラスの上にカスタムシリアライザを記述し、 '@JsonDeserialize(using = CustomDeserializer.class)'と '@ JsonSerialize'を使ってリストに注釈を付けることができます – varren

答えて

3

ジャクソンサポート@JsonIdentityInfo。この注釈をクラスに追加すると、そのクラスのすべてのインスタンスが追加のIDフィールドでシリアル化され、次に同じインスタンスをシリアル化する必要があるときに、そのIDフィールドの値が書き込まれますオブジェクト全体の代わりに。

ただし、これは標準のJSONではありません。通常、JSON形式は、多くのライブラリで広くサポートされているため、通常は使用されます。この機能を使用すると、APIクライアントに追加の問題が発生する可能性があります。

public class RegistryEntry { 
     @JsonIgnoreProperties("relatedRegistryEntries") 
     private List<RegistryEntry> relatedRegistryEntries; 
} 
+0

ありがとうございました! – Everv0id