2011-01-27 12 views
16

मैं जैक्सन 1.6.4 और जावा जेडीके 6 का उपयोग कर रहा हूं 6.क्या एनोटेशन के बिना जैक्सन बिल्कुल सेटर्स की आवश्यकता है?

मैं जैक्सन एनोटेशन का उपयोग नहीं करना चाहता; मैं सेटर्स के बिना अपरिवर्तनीय जावा ऑब्जेक्ट्स रखना चाहता हूं।

दो आवश्यकताएं संघर्ष में दिखाई देती हैं।

यदि मैं निजी सेटर्स deserialization जोड़ता है ठीक काम करता है।

मैं अपने अपरिवर्तनीय वस्तुओं के लिए निजी सेटर्स का सहारा लेने की कोशिश नहीं कर रहा हूं - मैं इस तरह जिद्दी हूं।

मैं किसी भी क्षेत्र की पहुंच की अनुमति देने के लिए दृश्यता जांचकर्ता के कस्टम कार्यान्वयन की कोशिश करने की प्रक्रिया में हूं।

लेकिन अगर किसी के पास कुछ सलाह या सबक सीखे हैं तो वे साझा कर सकते हैं मैं उनकी सुनवाई की सराहना करता हूं।

अपडेट: यह काम कर रहा है।

बिल्डर पैटर्न, निजी कन्स्ट्रक्टर - एक ला ब्लोच "प्रभावी जावा"।

यह deserialization विन्यास और दृश्यता सेटिंग ले लिया, लेकिन अब यह जाना अच्छा है।

public class JsonMapper 
{ 
    private static final int INITIAL_SIZE = 2048; 
    /** See http://wiki.fasterxml.com/JacksonBestPracticeThreadSafety?highlight=(\bCategoryJackson\b) */ 
    private static ObjectMapper mapper; 

    static 
    { 
     mapper = new ObjectMapper(); 

     mapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false); 
     SerializationConfig serializationConfig = mapper.getSerializationConfig(); 
     serializationConfig.setDateFormat(Person.DEFAULT_FORMATTER); 

     mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,false); 
     DeserializationConfig deserializationConfig = mapper.getDeserializationConfig(); 
     deserializationConfig.setDateFormat(Person.DEFAULT_FORMATTER); 
     deserializationConfig.enable(DeserializationConfig.Feature.AUTO_DETECT_FIELDS); 
     mapper.setVisibilityChecker(VisibilityChecker.Std.defaultInstance().withFieldVisibility(JsonAutoDetect.Visibility.ANY)); 
    } 

    public static <T> String serialize(T o) throws IOException 
    { 
     StringWriter sw = new StringWriter(INITIAL_SIZE); 
     mapper.writeValue(sw, o); 

     return sw.toString(); 
    } 

    public static <T> T deserialize(String source, Class<T> targetClass) throws IOException 
    { 
     ByteArrayInputStream stream = new ByteArrayInputStream(source.getBytes()); 
     TreeTraversingParser treeTraversingParser = new TreeTraversingParser(mapper.readTree(stream)); 
     treeTraversingParser.setCodec(mapper); 

     return treeTraversingParser.readValueAs(targetClass); 
    } 
} 
+1

यदि आपकी कक्षाएं अपरिवर्तनीय हैं, तो जैक्सन को उन्हें कैसे पॉप्युलेट करना चाहिए? – skaffman

+0

बिल्डर पैटर्न – duffymo

+6

यदि आपने अपनी समस्या का समाधान किया है, तो कृपया नीचे दिए गए उत्तर के रूप में अपना समाधान पोस्ट करें, ताकि आपका प्रश्न अनुत्तरित न हो। –

उत्तर

17

आप यह काम किया जाता सुनने के लिए खुशी है कि - ऑटो का पता लगाने दृश्यता का स्तर बदलने की क्षमता एक बहुत शक्तिशाली सुविधा है, लेकिन वहाँ है कि यह तुच्छ सब वहाँ है खोजने के लिए नहीं है तो कई विशेषताएं हैं।

अतिरिक्त पॉइंटर्स का जोड़ा: यदि आप पीओजेओ में जैक्सन एनोटेशन जोड़ना नहीं चाहते हैं, तो भी आप mix-in annotations का उपयोग कर सकते हैं। इसके साथ, आप गैर-डिफॉल्ट कन्स्ट्रक्टर का उपयोग करने के लिए @ जेसन क्रिएटर का उपयोग कर सकते हैं जो वास्तविक अपरिवर्तनीय मूल्य प्रकार (जैक्सन पर अधिक और this article पर अपरिवर्तनीय प्रकार) की अनुमति देता है।

और अंत में: जबकि निर्माता पैटर्न अभी तक समर्थित नहीं है, इसकी योजना this Jira entry के अनुसार बनाई गई है।

+0

मुझे कोई एनोटेशन नहीं चाहिए, क्योंकि मैं अपने डोमेन मॉडल में जैक्सन पर निर्भरता बनाना नहीं चाहता हूं। मैंने जैक्सन और एक्सएमएल दोनों के लिए कार्यान्वयन के साथ एक अलग मैपर इंटरफेस में धारावाहिकता को स्थानांतरित करके इसे प्रबंधित किया है। – duffymo

+0

यह डोमेन मॉडल में निर्भरता नहीं जोड़ता है, क्योंकि निर्भरता अतिरिक्त मिश्रण-प्रकारों से डोमेन मॉडल तक है। और केवल उन विशिष्ट मामलों के लिए किया जाना चाहिए जहां ओवरराइड की आवश्यकता होती है। मैं सामान्य प्रकार से क्रमबद्धता विशिष्ट प्रकारों पर निर्भरता से बचने की इच्छा को समझता हूं; कार्यान्वयन मिश्रण-एनोटेशन सिस्टम में यह मुख्य प्रेरणा थी। – StaxMan

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