2011-03-22 14 views
7

मैं कंट्रोलर के साथ स्प्रिंग एमवीसी का उपयोग कर रहा हूं, मेरा सवाल यह है कि मैं एक JSON प्रतिक्रिया कैसे वापस कर सकता हूं जो @ResponseBody ऑब्जेक्ट से अलग है जो वापस लौटाया जाता है और एक JSON को वापस करने के लिए प्रेरित किया जाता है।वसंत एमवीसी जेएसओएनएस और अपवाद को संभालने

आगे विस्तार करने के लिए, मैं वस्तु "UserDetails" जो दो क्षेत्रों "नाम", "EmailAddress" कहा जाता है कहा जाता है

@ResponseBody UserDetails 

अब json लौटे

{नाम की तरह दिखाई देगा : "TheUsersName", EMAILADDRESS: "[email protected]"}

वहाँ किसी भी तरह से मैं लौटने से पहले json संशोधित कर सकते हैं (ए है सभी नियंत्रकों में सभी विधियों में एलएल जेसन) जहां एक "स्थिति" फ़ील्ड जोड़ा जाएगा और अन्य जेसन डेटा जेसन में "डेटा" कुंजी के नीचे होंगे। और अपवाद का नाम (कम से कम स्थिति हिस्सा हालांकि)

+0

शायद संबंधित: http://stackoverflow.com/questions/6014784/serialize-specific-exceptions-with-spring-mvc – Bozho

उत्तर

2

हाँ:

इसके अलावा मैं कैसे जब कहीं से जावा सर्वर एक अपवाद फेंकता दृश्यपटल के लिए एक json वापसी करते हैं, json "झूठे स्थिति" होना चाहिए। इसके बजाय एक मॉडल और एक दृश्य लौटें।

public ModelMap getUserDetails() { 
    UserDetails userDetails; // get this object from somewhere 
    ModelMap map = new ModelMap()(; 
    map.addAttribute("data", userDetails); 
    map.addAttribute("success", true); 
    return map; 
} 

अपवाद जोड़ने के लिए आप एक कुंजी और सफलता = झूठी के साथ ऐसा ही करेंगे।

public class Response<T> { 
    T data; 
    boolean status = true; 

    public Response(T d) { data = d; } 
} 

फिर उस लौटने अपने नियंत्रकों से:

+0

मुझे नहीं पता कि 'ModelAndView' क्या मूल्य जोड़ता है। क्यों न केवल 'मॉडल मैप' वापस करें? – skaffman

+0

मुझे यकीन है कि मैं मॉडल और व्यू का उपयोग क्यों करना चाहूंगा, हालांकि आपने मुझे एक नक्शा (हैश मैप) का उपयोग करने का विचार दिया जो एक आकर्षण की तरह काम करता था और मुझे वांछित आउटपुट देता था। हालांकि मैं असफल परिदृश्य में ऐसा कैसे करूं? हालांकि नियंत्रकों में सभी नियंत्रकों और सभी कार्यों के लिए जब इसे केंद्रीकृत करने का कोई तरीका है? – MilindaD

+0

@ स्काफमैन आप सही हैं। विचारों को वापस करने से मस्तिष्क का फव्वारा भी। @ मिलिंडा डी मॉडलमैप को चाबियों की आवश्यकता नहीं है लेकिन बहुत अलग नहीं है। यह मानचित्र लागू करता है। –

14

एक प्रतिक्रिया कक्षा बनाएं

@ResponseBody public Response getUserDetails) { 
    //... 
    return new Response(userDetails); 
} 

अपवाद के लिए आप की तरह एक वस्तु वापस जाने के लिए चाहता हूँ:

public class BadStatus { 
    String errorMessage; 
    boolean status = false; 

    public BadStatus(String msg) { errorMessage = msg; } 
} 

@ExceptionHandler(Exception.class) 
public BadStatus handleException(Exception ex, HttpServletRequest request) { 
    return new BadStatus(ex.getMessage()); 
} 
+0

इस धागे को और अधिक विस्तृत उत्तर के लिए देखें: http://stackoverflow.com/questions/5641091/spring-3-exception-handling-using-json – Sydney

2

एक वैकल्पिक समाधान (वसंत 3.1 के साथ काम करता है), जो कम आक्रामक

है

अपने वसंत config में:

<bean id="jacksonConverter"  class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" /> 
<mvc:annotation-driven> 
    <mvc:message-converters> 
     <bean class="mypackage.MyMessageConverter" 
      p:delegate-ref="jacksonConverter"> 
     </bean> 
    </mvc:message-converters> 
</mvc:annotation-driven> 

कि आप अपना खुद HttpMessageConverter प्रदान करना है कि प्रदान की जाती जैक्सन कनवर्टर के प्रतिनिधियों।

public class MyMessageConverter implements HttpMessageConverter<Object> { 
// setters and delegating overrides ommitted for brevity 
@Override 
    public void write(Object t, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, 
      HttpMessageNotWritableException { 
// t is whatever your @ResponseBody annotated methods return 
     MyPojoWrapper response = new MyPojoWrapper(t); 

     delegate.write(response, contentType, outputMessage); 
    } 
} 

इस तरह आपके सभी pojos कुछ अन्य जेसन के साथ लिपटे हैं जो आप वहां प्रदान करते हैं।

अपवादों के लिए, एरिकैम द्वारा प्रस्तावित समाधान जाने का सबसे आसान तरीका है ('BadStatus' रिटर्न प्रकार को @ResponseBody के साथ एनोटेट करना याद रखें)।

एक चेतावनी: आपका जेसन-सीरियलाइज्ड BadStatus MyMessageConverter के माध्यम से भी जाता है, इसलिए आप ऑब्जेक्ट प्रकार के लिए ओवरडिन 'लेखन' विधि में परीक्षण करना चाहते हैं, या MyPojoWrapper हैंडल है।

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