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!
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
Ho aggiornato la mia risposta di conseguenza. –