2012-10-05 12 views
22

मैं जैक्सन का उपयोग कर रहा हूँ और मैं समस्या आ रही है, जब मैं एक वस्तु मैं निम्नलिखित त्रुटि मिलती है deserialize करने की कोशिश:के कहने का निर्माण नहीं कर सकते - जैक्सन

com.fasterxml.jackson.databind.JsonMappingException: 
    Can not construct instance of net.MyAbstractClass, 
    problem: abstract types either need to be mapped to concrete types, 
     have custom deserializer, or be instantiated with additional type information 

मैं विशेषता में समस्या हो रही हूँ:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT, property = "@id") 
@JsonSubTypes({ @JsonSubTypes.Type(value = MyAbstractClass.class, name = "MyAbstractClass") }) 
@ManyToOne 
private MyAbstractClass object; 

क्या कोई मेरी मदद कर सकता है?

+0

इसी तरह के मामले पर एक और चर्चा https://stackoverflow.com/a/32777371/873282 पर की जाती है। विशेष रूप से दिलचस्प है कि '@JsonTypeInfo (उपयोग = JsonTypeInfo.Id.CLASS का उपयोग करने के लिए टिप्पणी करने वाली टिप्पणी, = jsonTypeInfo.As.PROPERTY, property = "type") शामिल है। इस तरह, JSON थोड़ा बड़ा है, लेकिन यह स्पष्ट है, किस प्रकार का उपयोग किया जाना चाहिए। – koppor

उत्तर

24

आप एक अमूर्त वर्ग, जैक्सन को न तो स्थापित कर सकते हैं। आपको जैक्सन जानकारी को कंक्रीट प्रकार के साथ MyAbstractClass को तुरंत चालू करने के बारे में जानकारी देना चाहिए।

stackoverflow पर इस जवाब देखें:, वर्ग ही नहीं है (यह कार्यान्वयन (उप) वर्गों की सूची की जरूरत है जो होगा: Jackson JSON library: how to instantiate a class that contains abstract fields

और शायद यह भी समझ में Jackson Polymorphic type handling

+2

मदद के लिए धन्यवाद, मैं हल हो गई साथ: 'JsonTypeInfo.Id.NAME, = JsonTypeInfo.As.PROPERTY, संपत्ति =" वर्ग "शामिल हैं)' 'संपत्ति =" वर्ग "', मेरे JSON जानकारी देते हुए आ रहा है किस बच्चे वर्ग का उपयोग किया जाएगा। –

+1

सावधान रहें, उपयोगकर्ताओं को यह निर्दिष्ट करने की अनुमति दें कि deserialization के दौरान कौन सी कक्षा का उपयोग करना है [v] [http://fishbowl.pastiche.org/2015/11/09/java_serialization_bug/) जैसी भेद्यताएं हो सकती हैं। –

+0

संदर्भ के लिए धन्यवाद: @JsonTypeInfo (उपयोग = JsonTypeInfo.Id.CLASS, = jsonTypeInfo.As.PROPERTY, संपत्ति = "@class") चाल है। जेपीए टेबल अवरोधक मूल्य की तरह। धन्यवाद। – 99Sono

6

आपका @JsonSubTypes घोषणा नहीं कर सकता देखना व्यर्थ रहो)। इसलिए आपको उस प्रविष्टि को उप-वर्ग (एसएस) सूची में संशोधित करने की आवश्यकता है; या उप-वर्ग पंजीकृत करने के लिए कुछ अन्य तंत्र का उपयोग करें (SimpleModule में addAbstractTypeMapping की तरह कुछ है)।