2012-11-29 43 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」:反向引用類型(java.util.Set中)不 與管理型(foo.Collaboration)兼容

其實,我知道,這是有道理的,因爲javadoc的明確規定您無法在集合上使用@JsonBackReference。我的問題是,我應該如何解決這個問題?我現在所做的是刪除父側的@JsonManagedReference註釋,並在子端添加@JsonIgnore。有人能告訴我這種方法的副作用是什麼?還有其他建議嗎?

+2

可以使用傑克遜2.0。見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 

    } 

} 

此序列化程序將只顯示Collaboration實體的一組有限的屬性。由於「標籤」屬性被忽略,所以不會發生循環引用。

這個話題很好看,可以發現here。它解釋了當你有類似的情況時的所有可能性。

+0

我有一個similalr情況http://stackoverflow.com/questions/28179369/spring-rest-json-can-not-handle-managed-back-reference-defaultreference-415 說明我還沒有設法找到使用註釋的直接解決方案。 – zencv

1

非常方便的接口實現在傑克遜2庫作爲

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

在行家

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

供參考:我認爲正確的maven依賴應該是' jackson-annotations'。無論如何,這就是我的構建工作。 – FrustratedWithFormsDesigner