2012-05-04 4 views
13


Ho un problema durante la conversione di oggetti di ibernazione in JSON con Jackson, perché alcuni oggetti hanno un riferimento automatico nella loro definizione. Il problema è che non controllo il codice di quelle entità, quindi non posso inserire annotazioni.auto riferimento jackson che porta al ciclo

In realtà vorrei limitare la profondità della ricorsività, ad esempio a 5 livelli. Ho bisogno di un codice generico che funzioni con qualsiasi oggetto entità che contiene riferimento automatico. È possibile? Non mi dispiace usare un'altra libreria JSON.

Il seguente semplice codice

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); 
} 

Mi dà eccezione:

 
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) 

Grazie in anticipo per qualsiasi suggerimento!

risposta

18

Usa Jackson 2.0 - gestisce i riferimenti ciclici (con @JsonIdentityInfo annotazione)

Se non è possibile aggiungere annotazioni direttamente alla classe quindi utilizzare le annotazioni Mixin. Un esempio qui: http://wiki.fasterxml.com/JacksonMixInAnnotations

+1

Grazie ma come ho scritto nel post originale, non posso inserire annotazioni nel codice di attivazione perché si tratta di software di terze parti. Questo può essere fatto da una configurazione al volo del mapper? – elkarel

+0

Ho aggiornato la mia risposta di conseguenza. –