2012-12-10 25 views
7

मैं जर्सी का उपयोग कर एक आरईएसटी सेवा लिख ​​रहा हूं। ,@JsonTypeInfo (उपयोग = JsonTypeInfo.Id.CLASS) प्रतिक्रिया वापस लौटने पर काम नहीं कर रहा है

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS) 

कि के लिए धन्यवाद जब मैं वस्तुओं की एक सूची लौट:

@GET 
@Produces(MediaType.APPLICATION_JSON) 
@Path("promotions/") 
public List<Promotion> getClosestPromotions() { 
List<Promotion> promotions = getPromotions(); //here I get some objects 

return promotions; 
} 

मैं के लिए एक "@class" क्षेत्र के साथ JSON स्ट्रिंग मिल रहा एक अमूर्त वर्ग संवर्धन एक एनोटेशन है कि है उस सूची में हर वस्तु। लेकिन समस्या यह है कि अगर मैं एक रिस्पांस वापसी:

@GET 
@Produces(MediaType.APPLICATION_JSON) 
@Path("promotions/") 
public Response getClosestPromotions() { 
List<Promotion> promotions = getPromotions(); //here I get some objects 

return Response.ok().entity(promotions).build(); 
} 

मैं लगभग एक ही सूची हो रही है, लेकिन बिना अतिरिक्त "@class" क्षेत्र। प्रतिक्रिया में एक सूची लौटने पर "@class" फ़ील्ड के साथ सूची प्राप्त करने के लिए मैं और क्या कर सकता हूं? और वैसे, आश्चर्यजनक रूप से, यह तब काम करता है जब मैं केवल एक इकाई के रूप में दिए गए एक प्रोमोशन ऑब्जेक्ट के साथ प्रतिक्रिया देता हूं और मुझे वह "@class" फ़ील्ड मिलता है।

+1

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

उत्तर

5

शायद तुम कोशिश करना चाहते हैं:

GenericEntity<Collection<Promotion>> genericEntity = 
      new GenericEntity<Collection<Promotion>>(promotions){}; 
return Response.ok().entity(genericEntity).build(); 
+1

आपको बहुत बहुत धन्यवाद! मैं अंत में यह काम कर रहा है! – krajol

+1

यह एक साधारण समाधान है जो बहुत अच्छी तरह से काम करता है, इसे साझा करने के लिए धन्यवाद! एकमात्र नकारात्मक बात यह है कि हमें हर समय अपने संग्रह को लपेटना याद रखना होगा। –

2

उप प्रकार एनोटेशन जोड़ने का प्रयास करें, यहां एक उदाहरण है कि मैं का उपयोग कर रहा है। यह सभी ऑपरेटिव उप प्रकारों को निर्दिष्ट करके आपकी समस्या का समाधान कर सकता है। क्षमा करें आपके सटीक उदाहरण का परीक्षण नहीं किया।

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class") 
@JsonSubTypes({ 
    @JsonSubTypes.Type(value=MetricCollection.class), 
    @JsonSubTypes.Type(value=Column.class), 
    @JsonSubTypes.Type(value=IntegerColumn.class), 
    @JsonSubTypes.Type(value=DoubleColumn.class), 
    @JsonSubTypes.Type(value=StringColumn.class) 
}) 
public interface IMetricCollection<T extends IMetric> { 
... 
} 
0

आप अपनी कक्षाओं उत्पन्न करने के लिए इस्तेमाल किया JAXB हैं, तो आप निश्चित रूप से विभिन्न प्रकार के एक सूची पार्स करने के लिए साथ @XmlElements की तरह कुछ हो सकता है।

अब, यदि आप जर्सी/जैक्सन के साथ एक ही जेएक्सबी कक्षाओं का भी उपयोग कर रहे हैं, तो आप ऑब्जेक्ट्स की सूची/ऐरे के नाम को प्रारूपित करने का वर्णन करने के लिए @JsonTypeInfo और @JsonSubTypes जोड़कर कक्षा के मेटाडेटा को बढ़ा सकते हैं।

जबकि @JsonTypeInfo को जोड़ने के प्रकार का वर्णन करता है, @JsonSubTypes संलग्न संग्रह के विकल्प देता है। उदाहरण के लिए, आउटपुट की संपत्ति को परिभाषित करने के लिए AsPPPERTY, जैसा कि नीचे दिए गए उदाहरण में प्रदर्शित किया गया है, जहां इकाइयों की एक सूची जिसमें विभिन्न प्रकार के तत्व हो सकते हैं, जिसमें स्वयं के प्रकार ("फॉर्म") 2 अन्य प्रकार के अलावा " फ़ील्ड "और" टेबल "।

public class Form { 

    @XmlElements({ 
    @XmlElement(name = "field", type = Field.class), 
    @XmlElement(name = "form", type = Form.class), 
    @XmlElement(name = "table", type = Table.class) 
    }) 
    @JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "obj") 
    @JsonSubTypes({ 
    @JsonSubTypes.Type(value = Field.class), 
    @JsonSubTypes.Type(value = Form.class), 
    @JsonSubTypes.Type(value = Table.class) 
    }) 
    @Generated(value = "com.sun.tools.internal.xjc.Driver", date = "2013-11-11T02:08:36-08:00", comments = "JAXB RI v2.2.4-2") 
    @JsonProperty("entities") 
    protected List<Object> fieldOrFormOrTable; 

जोड़ा मेटाडाटा के साथ जर्सी के जैक्सन डिफ़ॉल्ट serializers का उपयोग करके निम्न हो जाएगा वस्तु की क्रमबद्धता ...

 "entities": [ 
        { 
        "obj": "Table", 
        "row": { 
         "id": 1, 
         "fields": [ 
          { 
           "id": "DEBUGARY", 
           "type": "Text", 
           "kind": "user" 
          } 
         ] 
        }, 
        "id": "DBGARRAY" 
       }, 
       { 
        "obj": "field", 
        "id": "IDBG", 
        "type": "Text", 
        "kind": "user" 
       }, 
     ..., ..., ...]