2012-11-29 14 views
8

मेरे पास मेरी संस्थाओं में कई रिश्तों के लिए एक द्विपक्षीय है। नीचे दिए गए उदाहरण देखें: `कई रिश्तों के लिए एक बिडरेक्शनल में साइक्लिक संदर्भ

" java.lang.IllegalArgumentException:/वापस कामयाब संभाल सकते हैं जब मैं JSON को यह क्रमानुसार करने की कोशिश

public class Collaboration { 

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

} 

public class Tag { 

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

} 

, मैं निम्न अपवाद हो रही है संदर्भ 'COLLABORATION_TAG':। वापस संदर्भ प्रकार (java.util.Set) कामयाब प्रकार (foo.Collaboration) के साथ संगत नहीं

वास्तव में, मैं जानता हूँ कि यह समझ में आता है क्योंकि जावाडोक स्पष्ट रूप से कहा कि आप संग्रह पर @JsonBackReference का उपयोग नहीं कर सकते हैं। मेरा सवाल है, मुझे इस समस्या को कैसे हल करना चाहिए? मैंने अभी जो किया है वह मूल पक्ष पर @JsonManagedReference एनोटेशन को हटा दिया गया है, और @JsonIgnore को बच्चे के पक्ष में जोड़ा गया है। क्या कोई मुझे बता सकता है कि इस दृष्टिकोण के दुष्प्रभाव क्या हैं? क्या कोई अन्य सुझाव हैं?

+2

आप जैक्सन 2.0 का उपयोग कर सकते में

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

के रूप में जैक्सन 2 पुस्तकालय में प्रदान की जाती है। Http://stackoverflow.com/questions/10065002/jackson-serialization-of-entities-with-birectional-relationships-avoiding-cyc –

+1

'JsonIdentityInfo' एनोटेशन सुंदर है, धन्यवाद @EugeneRetunsky! http://wiki.fasterxml.com/JacksonFeatureObjectIdentity –

+0

मैं कोशिश की है 'JsonManagedReference' और' JsonBackReference' उनमें से कोई भी काम : मैं इस पेज कि कैसे काम करता है जानने के लिए बहुत उपयोगी पाया। लेकिन, @ साइमन एंड्रेफोर्सबर्ग का दिया गया लिंक बहुत ही रोचक और काम करता है। – yas

उत्तर

3

मैंने निम्नलिखित समाधान को लागू करने का अंत किया।

रिश्ते का एक छोर माता-पिता माना जाता है। इसे किसी जैक्सन से संबंधित एनोटेशन की आवश्यकता नहीं है।

public class Collaboration { 

    private Set<Tag> tags; 

} 

संबंध के दूसरी ओर इस प्रकार कार्यान्वित किया जाता है।

public class Tag { 

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

} 

मैं एक कस्टम serializer उपयोग कर रहा हूँ सुनिश्चित करें कि कोई चक्रीय संदर्भ हो जाएगा कर देगा करने के लिए। serializer इस तरह लागू किया जा सकता:

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 

    } 

} 

यह serializer केवल सहयोग इकाई के गुणों के एक सीमित सेट दिखाएगा। चूंकि "टैग" संपत्ति को छोड़ दिया जाता है, इसलिए कोई चक्रीय संदर्भ नहीं होगा।

इस विषय के बारे में एक अच्छा पढ़ा here पाया जा सकता है। जब आप एक समान परिदृश्य रखते हैं तो यह सभी संभावनाओं को समझाता है।

+0

मेरे पास एक सिमिलर स्थिति है जो http://stackoverflow.com/questions/28179369/spring-rest-json-can-not-handle-managed-back-reference-defaultreference-415 में अभी भी समझा नहीं गया है एनोटेशन का उपयोग कर एक सीधा समाधान। – zencv

1

बहुत आसान इंटरफेस कार्यान्वयन Maven

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

एफवाईआई: मुझे लगता है कि सही मेवेन निर्भरता ' जैक्सन-एनोटेशन' होना चाहिए। वैसे भी, मेरे निर्माण के लिए भी यही काम किया। – FrustratedWithFormsDesigner