2015-01-14 10 views
6

के रूप में वापसी सूची मुझे टॉमकैट और ग्लासफ़िश पर चलते समय एक ही कोड चलाने वाली लौटाई गई सूची की जेसन संरचना में अंतर का सामना करना पड़ रहा है।जर्सी आराम सर्वर - जेसन

@XmlRootElement 
public Class Person { 
    private int personId; 
    private String name; 
} 

@GET 
@Path("/persons") 
public Response getPersons() 
{ 
    List<Person> persons = new ArrayList<Person>(); 
    persons.add(new Person(1, "John Smith")); 
    persons.add(new Person(2, "Jane Smith")); 

    GenericEntity<List<Person>> entity = new GenericEntity<List<Person>>(Lists.newArrayList<persons)) {}; 
    Return Response.ok(entity).build(); 
} 

तो बिल्ला पर json प्रारूप (मैं स्थानीय मशीन पर बिलाव चल रहा हूँ) में लौट आए परिणाम होगा:

[ 
    { 
     "personId" : "1", 
     "name" : "John Smith" 
    }, 
    { 
     "personId" : "2", 
     "name" : "Jane Smith" 
    } 
] 

और अगर Glassfish पर json प्रारूप में लौट आए (दूरस्थ सर्वर पर Glassfish चल) परिणाम होगा:

{ 
    "person" : 
    [ 
     { 
      "personId" : "1", 
      "name" : "John Smith" 
     }, 
     { 
      "personId" : "2", 
      "name" : "Jane Smith" 
     } 
    ] 
} 

मैं इस प्रारूप को अपने स्वयं कैसे नियंत्रित कर सकता हूं? यदि संभव हो तो मैं सरणी प्रारूप (टॉमकैट पर) पसंद करूंगा। किसी भी तरह से मैं इसे एक ही परिणाम का उत्पादन करना चाहता हूं।

संपादित करें:

निर्भरता: जर्सी-कंटेनर-सर्वलेट (2.14), जर्सी-सर्वर (2.14), जर्सी-मीडिया-Moxy (2.14), javax.servlet-api (3.0.1)

Glassfish के संस्करण: 3.1.2.2 (निर्माण 5)

संपादित करें 2: यह जर्सी 2.14 और Glassfish 3.x

मैं जूस साथ एक समस्या है टी ग्लासफ़िश 3 और 4 स्थापित नहीं किया और प्रतिक्रिया की जांच करने के लिए बाकी ऐप को तैनात किया। सूची लौटने पर इसके परिणामस्वरूप विभिन्न जेसन संरचना हुई। ग्लासफ़िश 4 की प्रतिक्रिया टॉमकैट पर चलने के परिणाम के समान थी।

+0

आप 'GenericEntity' का उपयोग किए बिना' List' से सीधे 'Response' का निर्माण करने की कोशिश की है? –

+0

मैंने कोशिश की है लेकिन यह काम नहीं करता है: SEVERE: MessageBodyWriter मीडिया प्रकार = एप्लिकेशन/जेसन के लिए नहीं मिला, टाइप = क्लास java.util.ArrayList, जेनेरिक टाइप = क्लास java.util.ArrayList। – sjallamander

+0

कृपया अपनी निर्भरताएं पोस्ट करें और किस ग्लासफ़िश के साथ आप काम कर रहे हैं। –

उत्तर

1

प्रयास करें प्रतिक्रिया MediaType टिप्पणी जोड़ने और सूची इस तरह नहीं GenericEntity के साथ प्रयास करें:

@GET 
@Path("/persons") 
@Produces({ MediaType.APPLICATION_JSON }) 
public Response getPersons() 
{ 
    List<Person> persons = new ArrayList<Person>(); 
    persons.add(new Person(1, "John Smith")); 
    persons.add(new Person(2, "Jane Smith")); 

Return Response.ok(persons).build(); 
} 
+0

मुझे GetPersons युक्त कक्षा पर @Produces annotion मिला है, जैसे: @Produces ({"application/json; qs = 1", "application/xml; qs = .5 "}) तो यह नहीं है। सूची परिणामों को भी त्रुटि में लौटाना: सेव: संदेशबॉडीवाइटर मीडिया प्रकार = एप्लिकेशन/जेसन के लिए नहीं मिला, टाइप = क्लास java.util.ArrayList, जेनेरिक टाइप = क्लास java.util.ArrayList। – sjallamander

+2

फिर सूची ऑब्जेक्ट वापस करने का प्रयास करें। 'सार्वजनिक सूची getPersons() {'और केवल' वापसी व्यक्तियों को वापस लौटने के लिए; 'और यदि आपके पास पहले से नहीं है तो आपको JAXB के लिए अपनी व्यक्तिगत कक्षा में एक गैर-तर्ककर्ता कन्स्ट्रक्टर की भी आवश्यकता हो सकती है। – FrAn

+0

फिर कुछ गलत होने पर मैं एक और वस्तु वापस नहीं कर पाऊंगा। अगर कुछ गलत हो जाता है तो मैं एक संदेश संदेश को एक त्रुटि संदेश देता हूं। – sjallamander

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