jsonignoreproperties - auto referencia de jackson que conduce al ciclo
jsonbackreference (1)
Tengo un problema al convertir objetos de hibernación a JSON con Jackson, porque algunos objetos tienen una autorreferencia en su definición. El problema es que no controlo el código de esas entidades, así que no puedo poner anotaciones allí.
En realidad, me gustaría limitar la profundidad de la recursividad, por ejemplo, a 5 niveles. Necesito un código genérico que funcione con cualquier objeto de entidad que contenga auto referencia ... ¿Es posible? No me importa usar otra biblioteca JSON.
El siguiente código simple
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);
}
Me da una excepción:
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)
¡Gracias de antemano por cualquier sugerencia!
Use Jackson 2.0 - maneja referencias cíclicas (con la anotación @JsonIdentityInfo
)
Si no puede agregar anotaciones directamente a la clase, use las anotaciones MixIn. Un ejemplo aquí: http://wiki.fasterxml.com/JacksonMixInAnnotations