2012-11-29 65 views
8

Tôi đang có nhiều mối quan hệ hai chiều với nhiều thực thể của mình. Xem ví dụ dưới đây:Tham chiếu tuần hoàn trong mối quan hệ nhiều chiều đến nhiều mối quan hệ

public class Collaboration { 

    @JsonManagedReference("COLLABORATION_TAG") 
    private Set<Tag> tags; 

} 

public class Tag { 

    @JsonBackReference("COLLABORATION_TAG") 
    private Set<Collaboration> collaborations; 

} 

Khi tôi cố gắng serialize này để JSON, tôi nhận được ngoại lệ sau đây: `

"java.lang.IllegalArgumentException: Không thể xử lý được quản lý/trở lại tài liệu tham khảo 'COLLABORATION_TAG':. kiểu tham chiếu trở lại (java.util.Set) không tương thích với kiểu quản lý (foo.Collaboration)

Thực ra, tôi biết điều này có ý nghĩa vì javadoc khẳng định một cách rõ ràng bạn không thể sử dụng @JsonBackReference trên Bộ sưu tập. Câu hỏi của tôi là, tôi nên giải quyết vấn đề này như thế nào? Những gì tôi đã làm bây giờ là xóa chú thích @JsonManagedReference ở phía bên mẹ và thêm @JsonIgnore vào bên con. Ai đó có thể cho tôi biết những tác dụng phụ của phương pháp này là gì? Có bất kỳ lời đề nghị khác?

+2

Bạn có thể sử dụng Jackson 2.0. Xem http://stackoverflow.com/questions/10065002/jackson-serialization-of-entities-with-birectional-relationships-avoiding-cyc –

+1

Chú thích 'JsonIdentityInfo' là đáng yêu, cảm ơn @EugeneRetunsky! Tôi thấy trang này rất hữu ích để tìm hiểu cách hoạt động: http://wiki.fasterxml.com/JacksonFeatureObjectIdentity –

+0

Tôi đã thử 'JsonManagedReference' và' JsonBackReference' không có công cụ nào trong số đó hoạt động. Nhưng, liên kết được đưa ra của @ SimonAndréForsberg rất thú vị và hoạt động. – yas

Trả lời

3

Tôi đã kết thúc triển khai giải pháp sau.

Một đầu mối quan hệ được coi là cha mẹ. Nó không cần bất kỳ chú thích nào liên quan đến Jackson.

public class Collaboration { 

    private Set<Tag> tags; 

} 

Mặt khác của mối quan hệ được thực hiện như sau.

public class Tag { 

    @JsonSerialize(using = SimpleCollaborationSerializer.class) 
    private Set<Collaboration> collaborations; 

} 

Tôi đang sử dụng bộ nối tiếp tùy chỉnh để đảm bảo rằng không có tham chiếu tuần hoàn nào xảy ra. Bộ nối tiếp có thể được triển khai như sau:

public class SimpleCollaborationSerializer extends JsonSerializer<Set<Collaboration>> { 

    @Override 
    public void serialize(final Set<Collaboration> collaborations, final JsonGenerator generator, 
     final SerializerProvider provider) throws IOException, JsonProcessingException { 
     final Set<SimpleCollaboration> simpleCollaborations = Sets.newHashSet(); 
     for (final Collaboration collaboration : collaborations) { 
      simpleCollaborations.add(new SimpleCollaboration(collaboration.getId(), collaboration.getName()));     
     } 
     generator.writeObject(simpleCollaborations); 
    } 

    static class SimpleCollaboration { 

     private Long id; 

     private String name; 

     // constructors, getters/setters 

    } 

} 

Bộ nối tiếp này sẽ chỉ hiển thị một tập hợp giới hạn các thuộc tính của thực thể Cộng tác. Vì thuộc tính "thẻ" bị bỏ qua, sẽ không có tham chiếu tuần hoàn nào xảy ra.

Đọc tốt về chủ đề này có thể được tìm thấy here. Nó giải thích tất cả các khả năng khi bạn đang có một kịch bản tương tự.

+0

Tôi có một tình huống similalr được giải thích trong http://stackoverflow.com/questions/28179369/spring-rest-json-can-not-handle-managed-back-reference-defaultreference-415 Tôi vẫn chưa tìm được một giải pháp trực tiếp sử dụng chú thích. – zencv

1

rất tiện dụng thực hiện giao diện được cung cấp trong jackson 2 thư viện như

@Entity 
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id") 
public class Collaboration { .... 

trong maven

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-core</artifactId> 
    <version>2.0.2</version> 
</dependency> 
+0

FYI: Tôi nghĩ rằng phụ thuộc maven chính xác phải là ' jackson-chú thích '. Đó là những gì làm việc cho xây dựng của tôi, anyway. – FrustratedWithFormsDesigner

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