2012-05-04 14 views
13



Mam problem podczas konwertowania obiektów hibernacji do JSON z Jacksonem, ponieważ niektóre obiekty mają własny odnośnik w swojej definicji. Problem polega na tym, że nie kontroluję kodu tych encji, więc nie mogę tam umieszczać adnotacji.Samouczek Jackson prowadzący do cyklu

Właściwie chciałbym ograniczyć głębokość rekursywności, na przykład do 5 poziomów. Potrzebuję ogólnego kodu, który działa z dowolnym obiektem obiektu, który zawiera samo referencję. Czy to możliwe? Nie mam nic przeciwko używaniu innej biblioteki JSON.

Poniższy prosty kod

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

Daje mi wyjątek:

 
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) 

Dzięki z góry za wszelkie sugestie!

Odpowiedz

18

Zastosowanie Jackson 2.0 - obsługuje odwołań cyklicznych (z @JsonIdentityInfo adnotacji)

Jeśli nie można dodawać adnotacje bezpośrednio do klasy następnie użyj wstawek adnotacje. Przykład tutaj: http://wiki.fasterxml.com/JacksonMixInAnnotations

+1

Dzięki, ale jak napisałem w oryginalnym poście, nie mogę umieścić adnotacji w kodzie strony, ponieważ jest to oprogramowanie innej firmy. Czy może to zrobić ktoś w konfiguracji latacza mappera? – elkarel

+0

Odpowiednio zaktualizowałem swoją odpowiedź. –