2012-05-04 4 views
13


いくつかのオブジェクトの定義に自己参照があるため、休止状態のオブジェクトをJSONとJSONに変換するときに問題があります。 問題は、それらのエンティティのコードを制御しないので、アノテーションをそこに入れることができないということです。ジャンクソンの自己参照がサイクルにつながる

実際、私は、再帰の深さを、例えば5段階に制限したいと考えています。私は自己参照を含む任意のエンティティオブジェクトで動作する汎用コードが必要です..それは可能ですか? 別のJSONライブラリを使用しても構いません。

次の簡単なコード

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

は私に例外を与える:任意の提案を事前に

 
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) 

感謝を!

答えて

18

使用Jackson 2.0 - あなたは、クラスに直接注釈を追加ミックスイン注釈を使用できない場合、それは

@JsonIdentityInfoアノテーションで)循環参照を処理します。ここの例:http://wiki.fasterxml.com/JacksonMixInAnnotations

+1

ありがとうございますが、元の投稿で書いたように、サードパーティのソフトウェアであるため、エンティティコードに注釈を付けることはできません。これはマッパーのいくつかのオンザフライ構成で行うことができますか? – elkarel

+0

私はそれに応じて私の答えを更新しました。 –