jackson Selbstreferenz führt zum Zyklus


Ich habe ein Problem beim Konvertieren von Objekten aus dem Ruhezustand in JSON mit Jackson, da einige Objekte in ihrer Definition eine Selbstreferenz haben. Das Problem ist, dass ich den Code dieser Entitäten nicht kontrolliere, so dass ich dort keine Anmerkungen einfügen kann.

Eigentlich möchte ich nur die Tiefe der Rekursivität begrenzen, zum Beispiel auf 5 Stufen. Ich benötige generischen Code, der mit jedem Entitätsobjekt funktioniert, das Selbstreferenz enthält. Ist das möglich? Es macht mir nichts aus, eine andere JSON-Bibliothek zu verwenden.

Der folgende einfache Code

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

Gibt mir eine Ausnahme:

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)

Vielen Dank im Voraus für alle Vorschläge!

Antworten auf die Frage(1)

Ihre Antwort auf die Frage