2012-04-10 14 views
10

मै मैकिंग जैकसनहट्प मैसेज कनवर्टर के माध्यम से हाइबरनेट/स्प्रिंग एमवीसी के साथ जैक्सन 1.9.2 का उपयोग कर रहा हूं।जैक्सन बिडरेक्शनल एक-से-कई रिश्तों के साथ उलझन में

जैक्सन बिडरेक्शनल एक से कई रिश्तों को क्रमबद्ध नहीं कर सकता है और अनंत लूप बनाता है।

कक्षाएं मैं उपयोग कर रहा हूँ कर रहे हैं:

  • वार्तालाप जो एसएमएस उदाहरणों में से एक सेट है।

  • प्रत्येक एसएमएस उदाहरण PHONENUMBERS

    का एक सेट है
  • प्रत्येक PhoneNumber एक माता पिता के संपर्क (इस द्विदिश कई-से-एक संबंध है)

मुझे क्या करना कोशिश कर रहा हूँ है बातचीत को क्रमबद्ध करने के लिए।

मैं @JsonManagedReference और @JsonBackReference तो जैक्सन अनंत लूप के कारण crashe होगा उपयोग नहीं करते हैं। लेकिन जब मैं उन्हें इस्तेमाल, संपर्कPhoneNumber में धारावाहिक रूप प्राप्त करता है।

 
Class Contact { 
    @JsonManagedReference 
    List<PhoneNumber> phoneNumber ; 
} 
Class PhoneNumber { 
    @JsonBackReference 
    Contact contact; 
} 

उत्पादन होता है:

 
{ <--------------------- Conversation 
    "id": 51, 
    "smsSet": [ 
     { 
     "id": 53, 
     "origin":, 
     "destination": "06533844XY", 
     "message": "Hello world!", 
     "phoneNumbers": [ 
      { 
      "id": 64, 
      "num": "06533844XY", 
      "creationDate": 1333992533000, 
      } 
     ], 
     } 
    ], 
    "creationDate": 1333992534000 
    } 
बजाय

 
{ <---------- conversation 
    "id": 51, 
    "smsSet": [ 
     { 
     "id": 53, 
     "origin":, 
     "destination": "06533844XY", 
     "message": "Hello world!", 
     "phoneNumbers": [ 
      { 
      "id": 64, 
      "num": "06533844XY", 
      "creationDate": 1333992533000, 
      "contact": <--------------------- Missing part 
      { 
       "id": 12, 
       "name": "Samuel Jackson", 
       "primaryNumber": "06533844XY" 
      } 
      } 
     ], 
     } 
    ], 
    "creationDate": 1333992534000 
    } 

उत्तर

1

पहली बार एक समाधान के रूप में, मैं इन टिप्पणियों को रखा और एक अन्य श्रेणी का निर्माण: ContactWithouPhoneNumber और करने के लिए एक क्षेत्र के रूप में यह जोड़ा फोन नम्बर कक्षा।

अब, प्रतिपादन से पहले, मैं संपर्क से संपर्क करने के लिए फोन नंबर से फोन नंबर को छोड़कर सभी फ़ील्ड कॉपी करता हूं। आउटपुट जेएसओएन में मुझे हर चीज की ज़रूरत है।

यह डीटीओ डिजाइन पैटर्न है।

0

आपकी कक्षा डीफ़ में एक चीज गलत है List का उपयोग; यदि आप इसके बजाय होना चाहिए:

List<PhoneNumber> phoneNumber ; 

अन्यथा के बाद जैक्सन नहीं जान सकता है कि किस प्रकार जब deserializing; और यहां तक ​​कि क्रमबद्ध करने पर भी समस्याएं पैदा हो सकती हैं (क्योंकि मूल प्रकार निश्चित रूप से ज्ञात नहीं है)। तो मैं पहले इस मुद्दे को ठीक कर दूंगा।

लेकिन इसके अतिरिक्त आपकी निर्भरता गलत तरीके से हो सकती है: @JsonManagedReference हमेशा क्रमबद्ध करने वाली पहली चीज़ होनी चाहिए। यदि यह मामला नहीं है, तो आप इन एनोटेशन का उपयोग नहीं कर सकते हैं। ऑब्जेक्ट्स को देखे बिना आप क्रमबद्ध करने की कोशिश कर रहे हैं, यह सुनिश्चित करना मुश्किल है (POJO परिभाषा और JSON थोड़ा सा प्रतीत होता है)।

+1

मैं जेनेरिक संस्करण का उपयोग कर रहा था, स्टैक ओवरफ्लो संपादक ने <निगल लिया है। मुझे लगता है कि क्या हो रहा है कि @JsonBackReference पहले क्रमबद्ध किया जा रहा है। – redochka

+0

आह ठीक है। हाँ, ऐसा लगता है कि अधिक संभावना है; त्रुटि अन्यथा अलग होगी। – StaxMan

7

मैं हाल ही में एक ऐसी ही समस्या का सामना करना पड़ा: जैक्सन - birectional रिश्ते (परहेज चक्र)

तो समाधान जैक्सन 2.0 में अपग्रेड करें, और कक्षाओं के लिए निम्न टिप्पणी जोड़ने के लिए है के साथ संस्थाओं के क्रमबद्धता:

@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, 
        property = "@id") 
public class SomeEntityClass ... 

तब समस्या यह है कि वसंत जैक्सन 2.0 के साथ काम नहीं करता है। यह निम्नलिखित तरीके से हल किया गया है:

<bean id="jacksonMessageConverter" 
      class="own.implementation.of.MappingJacksonHttpMessageConverter"/> 

<bean class="org.springframework.web.servlet.mvc 
      .annotation.AnnotationMethodHandlerAdapter"> 
     <property name="messageConverters"> 
      <list> 
       <ref bean="jacksonMessageConverter"/> 
      </list> 
     </property> 
     <property name="requireSession" value="false"/> 
    </bean> 

और own.implementation.of.MappingJacksonHttpMessageConverter आधारित है इस पर:

http://www.jarvana.com/jarvana/view/org/springframework/spring-web/3.0.0.RELEASE/spring-web-3.0.0.RELEASE-sources.jar!/org/springframework/http/converter/json/MappingJacksonHttpMessageConverter.java?format=ok

लेकिन जैक्सन 2.0 के बजाय से ObjectMapper और अन्य जैक्सन कक्षाओं का उपयोग जैक्सन के 1. *

+1

धन्यवाद, बस यह कोशिश की, और ऐसा लगता है कि लौटा वार्तालाप सूची में केवल पहली बातचीत के साथ काम कर रहा है। कोई उपाय? मुझे JsonIdentityInfo कहां रखा जाना चाहिए? – redochka

+0

आपको दोनों कक्षाओं (संपर्क और फोन नम्बर) के लिए जेसन इडेंटिटीइन्फो डालने की आवश्यकता है और जेसनबैक/प्रबंधित रेफरेंस एनोटेशन (जहां तक ​​मैं आपके प्रश्न से समझ गया) को हटा दें। –

+0

जब मैं जेसनबैक/प्रबंधित रेफरेंस एनोटेशन को हटाता हूं तो मुझे निम्न त्रुटि मिलती है: com.fasterxml.jackson.databind.JsonMappingException: कक्षा com.fasterxml.jackson.databind.deser.impl.PropertyBasedObjectIdGenerator के पास कोई डिफ़ॉल्ट (कोई तर्क नहीं) कन्स्ट्रक्टर है (संदर्भ के माध्यम से चेन: java.util.ArrayList [0] -> com.model.Conversation ["smsSet"] ​​-> java.util.LinkedHashSet [0] -> com.model.SmsBean ["phoneNumbers"] -> org.hibernate। संग्रह। PersistentSet [0]) – redochka

0

आप फ़ील्ड में @ जेसन इग्नोर जोड़ सकते हैं और मैपरर क्रमबद्धता के दौरान उन पर छोड़ देगा। यह @ ट्रान्सेंट के लिए फ़ंक्शन में समान है।

यह जैक्सन-कोर-एएसएल में है।

+2

यह वास्तव में एक समाधान नहीं है । उन्हें धारावाहिक होने के लिए उन क्षेत्रों की जरूरत है। –

संबंधित मुद्दे