2013-06-22 3 views
14

कहते हैं कि मैं एक डोमेन वर्ग करते हैं:स्प्रिंग @RequestBody विभिन्न प्रकार (लेकिन एक ही इंटरफ़ेस) की सूची से युक्त

public class Zoo{ 
     private List<Animal> animals; 
     .... 

जहां एक पशु विभिन्न कार्यान्वयन (बिल्ली, कुत्ते) के साथ एक अंतरफलक है। मान लीजिए कि मैं एक चिड़ियाघर वस्तु को बचाने के लिए सक्षम होने के लिए चाहते हैं:

@RequestMapping(value = "/zoo", method = RequestMethod.POST) 
    public @ResponseBody void save(@RequestBody Zoo zoo) { 
    .... 

और मैं एक json भेजना चाहते हैं - जैसे कुछ:

{ 
     animals:[ 
      {type:'Cat', whiskers-length:'3'}, 
      {type:'Dog', name:'Fancy'} 
     ] 
    } 

मैं कैसे बता सकता वसंत MVC बिल्ली के लिए पशु मैप करने के लिए टाइप करें == 'बिल्ली' टाइप करें और टाइप करें == 'कुत्ता' टाइप करते समय इसे कुत्ते वर्ग में मैप करें?

+0

क्षमा करें पर पाया जा सकता। लेकिन फिर भी यह मेरी समस्या का समाधान नहीं करता है, जो जेसन ऑब्जेक्ट से मैपिंग है {प्रकार: 'बिल्ली', व्हिस्कर लम्बाई: '3'} बिल्ली वर्ग में। चिड़ियाघर कक्षा केवल यह जानती है कि जानवरों की सूची में जानवर होते हैं। लेकिन जेसन deserializer कैसे पता है कि विशिष्ट जेसन ऑब्जेक्ट के लिए उपयोग करने के लिए पशु इंटरफ़ेस (कुत्ता या बिल्ली) का कार्यान्वयन? –

उत्तर

15

आपको पॉलिमॉर्फिक जेसन प्राप्त करने के लिए जैक्सन एनोटेशन @JsonTypeInfo और @JsonSubTypes का उपयोग करना चाहिए। एनोटेशन Animal बेस क्लास पर जाते हैं।

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

} 
+0

यह काम करता है! आपका बहुत बहुत धन्यवाद! –

+3

यह 2 उपप्रकारों (बिल्लियों और कुत्तों) के लिए बहुत अच्छा लग रहा है, लेकिन यदि आपके पास उपप्रकारों की एक बड़ी सूची है तो क्या होगा? चिड़ियाघर में जानवरों के अधिक प्रकार हैं :) – Wouter

+1

क्या बिल्ली पर कुत्ते या कुत्ते पर कुछ एनोटेशन डालने का कोई तरीका है, जानवरों पर '@ जेसनसबिट्स' डाले बिना? – dmitryvim

3

वहाँ एक सरल व्याख्या अब बाहर है:

@JsonRootName("dog") 
public class Dog extends Animal {...} 

एनोटेशन के संदर्भ अमान्य JSON के साथ भ्रम के लिए fasterxml.github

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