2013-08-23 13 views
10

पर एकाधिक उपप्रकारों को कैसे मैप करें I जैक्सन 1.9.x का उपयोग कर रहा हूं। पशु उदाहरण पर बने रहना, यहाँ मैं क्या करना चाहते हैं क्या करना है:जैक्सन पॉलिमॉर्फिज्म: एक ही कक्षा

चलो कहते हैं कि मैं एक पशु वर्ग करते हैं:

public class Animal { 
    private String type; 
    // accessors 
} 

public class Mammal extends Animal { 
    private String diet; 
    // accessors 
} 

public class Bird extends Animal { 
    private boolean tropical; 
    // accessors 
} 

मैं चाहूँगा इस तरह कुछ करने के लिए सक्षम होने के लिए (मैं कहाँ नक्शा एक वर्ग के लिए कुछ उपप्रकार है, और कुछ और एक अलग वर्ग के लिए):

@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "type") 
@JsonSubTypes({@JsonSubTypes.Type(value = Mammal.class, name = "Dog"), 
       @JsonSubTypes.Type(value = Mammal.class, name = "Cat"), 
       @JsonSubTypes.Type(value = Bird.class, name = "Dodo"}, 
       @JsonSubTypes.Type(value = Bird.class, name = "Cockatoo"}) 
public class Animal { 

} 

क्या मैं अभी दिखाई दे रही है कि जैक्सन केवल कुत्ते-टू-स्तनपायी और दोदो करने वाली चिड़िया पहचान लेंगे है मानचित्रण। ऐसा इसलिए है क्योंकि StdSubtypeResolver._collectAndResolve() केवल उसी वर्ग को पंजीकृत होने की अनुमति देता है (NamedType.equals() के कार्यान्वयन के कारण)।

क्या मैं देख रहा हूं कि इस मुद्दे पर कोई कामकाज है?

+0

[यह] (http://www.cowtowncoder.com/blog/archives/2010/03/entry_372.html) संबंधित लगता है ... – jahroy

+0

मैं स्वीकार्य उत्तर के रूप में StaxMan के उत्तर को चिह्नित कर रहा हूं, लेकिन वास्तव में यह वास्तव में है वह विचार जिस पर उन्होंने चर्चा की थी, जिसे मैं लागू करने की योजना बना रहा हूं। अभी के लिए मेरे पास जैक्सन-डाटाबेस मुद्दे ट्रैकर को आरएफई दर्ज करने की कोई योजना नहीं है। –

उत्तर

3

शायद एनोटेशन का उपयोग करके नहीं। समस्याएं इस तथ्य से आती हैं कि इस तरह की मैपिंग क्रमबद्धता के लिए काम नहीं करेगी, और मौजूदा मानचित्रण एक-से-एक (विभाजन) संबंध की अपेक्षा करता है। लेकिन आप jackson-databind issue tracker पर एक आरएफई दर्ज करना चाहते हैं; समर्थन जोड़ना संभव हो सकता है।

+0

धन्यवाद StaxMan। क्या मैं यह मानने में सही हूं कि आप जैक्सन के प्रमुख लेखक हैं? एक चीज जिसे मैंने सोचा था लेकिन वास्तव में खोज नहीं किया है वह कस्टम Deserializer + TypeDeserializer का उपयोग है। क्या यह मेरी मदद करेगा? आप किस तरह की समस्याएं उम्मीद करते हैं कि मैं दौड़ूंगा? –

+0

सही, मैं मुख्य लेखक हूं। और हां, कस्टम टाइप (डी) सीरिएलाइज़र वह है जो आपको वास्तव में चाहिए (या इसके बजाय, प्रकार आईडी से बाध्यकारी); डिफ़ॉल्ट serializer/deserializer बिल्कुल कोई संशोधन के साथ काम करना चाहिए। विभिन्न समावेशन विधियों इत्यादि का समर्थन करने के लिए आईडी हैंडलिंग डिज़ाइन द्वारा मॉड्यूलर टाइप करें – StaxMan

+1

बस इस समस्या से संबंधित एक समस्या बनाई गई है क्योंकि मैं एक ही समस्या में चल रहा हूं – TheBakker

2

मुझे भी एक ही समस्या का सामना करना पड़ा और पता चला कि सबटाइप मैपिंग अद्वितीय कक्षाओं की अपेक्षा करता है।

मैंने जो किया वह दो वर्ग बनाने के लिए था जो समान आधार वर्ग का विस्तार करते थे। विस्तारित कक्षाएं खाली हैं क्योंकि उनके पास बेस क्लास के समान गुण हैं। फिर उन्हें उप प्रकार के मानचित्र में जोड़ा गया। उदाहरण के लिए, अपने मामले में, यह होगा -

@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "type") 
@JsonSubTypes({@JsonSubTypes.Type(value = Mammal.class, name = "Dog"), 
      @JsonSubTypes.Type(value = Mammal.class, name = "Cat"), 
      @JsonSubTypes.Type(value = BirdDodo.class, name = "Dodo"}, 
      @JsonSubTypes.Type(value = BirdCockatoo.class, name = "Cockatoo"}) 
public class Animal { 

} 

public class BirdCockatoo extends Cockatoo{} 
public class BirdDodo extends Dodo{} 

मैं समझता हूँ कि यह सबसे अच्छा तरीका नहीं है, लेकिन जब तक समस्या का समाधान नहीं है, यह सबसे अच्छा तरीका है इसे ठीक करने के हो सकता है। मैंने अभी इस दृष्टिकोण का पालन किया।

उम्मीद है कि यह आपकी मदद करता है!

3

बग, संस्करण 2.6.0 में हल किया गया है, ताकि आप केवल संस्करण 2.6.0 या बाद में करने के लिए जैक्सन को अपडेट करना होगा। अतिरिक्त जानकारी here और here है।

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