2012-05-04 43 views
13


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í.auto referencia de jackson que conduce al ciclo

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!

Respuesta

18

Uso Jackson 2.0 - que maneja referencias cíclicas (con @JsonIdentityInfo anotación)

Si no puede añadir anotaciones directamente a la clase a continuación, utilizar las anotaciones MixIn. Un ejemplo aquí: http://wiki.fasterxml.com/JacksonMixInAnnotations

+1

Gracias pero como escribí en la publicación original, no puedo poner anotaciones en el código de la entidad porque es un software de terceros. ¿Puede esto hacerse mediante la configuración sobre la marcha del asignador? – elkarel

+0

Actualicé mi respuesta en consecuencia. –

Cuestiones relacionadas