2012-05-04 37 views
13


Tôi gặp sự cố khi chuyển đổi đối tượng hibernate sang JSON bằng Jackson, vì một số đối tượng có tham chiếu tự trong định nghĩa của chúng. Vấn đề là tôi không kiểm soát mã của các thực thể đó nên tôi không thể đặt chú thích ở đó.jackson tự tham chiếu dẫn đến chu kỳ

Thực ra tôi muốn giới hạn độ sâu của đệ quy, ví dụ đến 5 cấp độ. Tôi cần mã chung mà làm việc với bất kỳ đối tượng thực thể có chứa tham chiếu tự .. Có thể? Tôi không ngại sử dụng thư viện JSON khác.

Các đơn giản mã sau

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

Cung cấp cho tôi ngoại lệ:

 
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) 

Cảm ơn trước cho bất cứ đề nghị!

Trả lời

18

Sử dụng Jackson 2.0 - nó xử lý tài liệu tham khảo theo chu kỳ (với @JsonIdentityInfo chú thích)

Nếu bạn không thể thêm chú thích trực tiếp đến lớp sau đó sử dụng các chú thích mixin. Một ví dụ ở đây: http://wiki.fasterxml.com/JacksonMixInAnnotations

+1

Cảm ơn nhưng như tôi đã viết trong bài đăng gốc, tôi không thể đặt chú thích trong mã entitiy vì đó là phần mềm của bên thứ 3. Điều này có thể được thực hiện bởi một số cấu hình trên máy bay của người lập bản đồ không? – elkarel

+0

Tôi đã cập nhật câu trả lời của mình cho phù hợp. –

Các vấn đề liên quan