2012-05-04 66 views
13


我在將hibernate對象轉換爲JSON時遇到了問題,因爲有些對象在其定義中有一個自引用。 問題是我不控制這些實體的代碼,所以我不能把註釋放在那裏。傑克遜自引用導致循環

其實我只想限制遞歸的深度,例如5個級別。我需要與包含自引用的任何實體對象一起工作的通用代碼。是否有可能? 我不介意使用另一個JSON庫。

下面的簡單代碼

ObjectMapper mapper = new ObjectMapper(); 

Query q = session.createQuery("from Hazard "); 
List<Hazard> hazards = q.list(); 

for (Hazard h : hazards) { 
    String hazardJson; 
    hazardJson = mapper.writeValueAsString(h); 
} 

讓我異常:

 
org.codehaus.jackson.map.JsonMappingException: Direct self-reference leading to cycle (through reference chain: com.fgm.imsma.pojo.Hazard["location"]->com.fgm.imsma.pojo.Location["location"]) 
    at org.codehaus.jackson.map.ser.BeanPropertyWriter._reportSelfReference(BeanPropertyWriter.java:473) 
    at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:411) 
    at org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:245) 
    at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:212) 
    at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:428) 
    at org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:245) 
    at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:212) 
    at org.codehaus.jackson.map.ser.StdSerializerProvider._serializeValue(StdSerializerProvider.java:587) 
    at org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue(StdSerializerProvider.java:245) 
    at org.codehaus.jackson.map.ObjectMapper._configAndWriteValue(ObjectMapper.java:1993) 
    at org.codehaus.jackson.map.ObjectMapper.writeValueAsString(ObjectMapper.java:1595) 
    at imsma.json.GetObjects.main(GetObjects.java:47) 

在此先感謝您的任何建議!

回答

18

使用Jackson 2.0 - 它處理循環引用(與@JsonIdentityInfo註釋)

如果你不能直接添加註釋的類,然後用混入註解。這裏的一個例子:http://wiki.fasterxml.com/JacksonMixInAnnotations

+1

謝謝,但正如我在原來的文章中寫道的,我不能把註釋放在entitiy代碼中,因爲它是第三方軟件。這可以通過映射器的一些動態配置完成嗎? – elkarel

+0

我相應地更新了我的答案。 –