2014-09-03 3 views
6

मेरे पास लगभग पचास नियंत्रक हैं जो @ResponseBody एनोटेशन का उपयोग करते हैं।वसंत अजाक्स @ रेस्पॉन्सबॉडी शून्य वापस मूल्यों के साथ

इस तरह

:

@RequestMapping(value = "/someUrl.controller", method = RequestMethod.GET) 
public @ResponseBody Object getObject(@RequestParam("id") Long id) { 
    Object object = provider.getObject(id); 
    return object; 
} 

कभी-कभी GetObject विधि वापसी null। समस्या यह है कि क्लाइंट पक्ष पर मुझे null के बजाय खाली प्रतिक्रिया मिलती है।

प्रारंभिक कार्यान्वयन में हमारे पास कस्टम JsonView ऑब्जेक्ट है जो @ResponseBody एनोटेशन के बिना रैपर के रूप में काम करता है।

इस तरह:

@RequestMapping(value = "/someUrl.controller", method = RequestMethod.GET) 
public JsonView<Object> getObject(@RequestParam("id") Long id) { 
    Object object = provider.getObject(id); 
    return new JsonView(object); 
} 

तो यह ठीक काम कर रहा था।

मुझे How do you override the null serializer in Jackson 2.0? पर कुछ समाधान मिला है लेकिन दुर्भाग्य से यह केवल पीओजेओ के क्षेत्रों के लिए ही काम करता है।

क्या आपके पास कोई विचार है कि इसे कैसे प्रबंधित किया जा सकता है?

अग्रिम धन्यवाद! इस तरह से अपने ग्राहक को पता है जब वस्तु प्रतिक्रिया की स्थिति की जांच रिक्त है में सक्षम हो जाएगा में

@RequestMapping(value = "/someUrl.controller", method = RequestMethod.GET) 
public ResponseEntity<Object> getObject(@RequestParam("id") Long id) { 
    Object object = provider.getObject(id); 
    if (object == null) { 
     return new ResponseEntity<Object> (HttpStatus.BAD_REQUEST); // Or any other error status 
    } else { 
     return new ResponseEntity<Object> (object, HttpStatus.OK); 
    } 
} 

:

+0

क्या आप हमें बता सकते हैं कि यह जेनेरिक 'जेसन व्यू' कक्षा किस पुस्तकालय से है? –

उत्तर

6

यह हल करने के लिए एक छोटी सी समस्या नहीं है।

वसंत में एक आम पैटर्न है जिसमें एक हैंडलर विधि null लौटाती है, यह इंगित करने के लिए है कि हैंडलर पहले ही उचित प्रतिक्रिया सामग्री तैयार करने और लिखने के साथ निपटा चुका है और आगे की ओर कोई और कार्रवाई आवश्यक नहीं है।

वसंत ने इस पैटर्न को RequestResponseBodyMethodProcesser (HandlerMethodReturnValueHandler@ResponseBody के लिए कार्यान्वयन) में लागू किया है। यह जांचता है कि वापसी मूल्य null है या नहीं। यह अनुरोध के रूप में अनुरोध सेट करता है। यदि वापसी मूल्य null नहीं है, तो यह उचित HttpMessageConverter के साथ क्रमबद्ध करने का प्रयास करता है।

एक विकल्प अपने स्वयं के @ResponseBodyNull एनोटेशन और एक इसी HandlerMethodReturnValueHandler जो एक ही करता है को छोड़कर भी null संभालती बनाने के लिए है। ध्यान दें कि आप RequestResponseBodyMethodProcess से कोड का पुन: उपयोग नहीं कर सकते हैं क्योंकि कुछ HttpMessageConvertersnull का उपयोग करने का प्रयास करने में असफल हो जाएंगे।

एक और इसी तरह के विकल्प null स्वीकार करने के लिए (के साथ सीमाएं ऊपर कहा गया है) और यह स्पष्ट रूप से रजिस्टर अपने RequestMappingHandlerMapping साथ, डिफ़ॉल्ट अधिलेखन HandlerMethodReturnValueHandler रों RequestResponseBodyMethodProcessor ओवरराइड करने के लिए है। जब तक आप कार्यक्षमता खोना नहीं चाहते हैं, तब तक आपको इसे सावधानी से करना होगा (यानी एक ही रजिस्टर करें)।

बेहतर समाधान, आईएमओ, प्रतिक्रिया शरीर में null से निपटने के लिए नहीं होगा। यदि getObject कुछ भी वापस नहीं करता है, जो मेरे लिए 404 जैसा लगता है। उपयुक्त प्रतिक्रिया कोड और voila सेट करें!

आप हमेशा अपने हैंडलर विधि में HttpServletResponse इंजेक्षन और मान लें कि आप जानते थे कि इस JSON करने के लिए श्रृंखलाबद्ध किया जा सकता था की तरह

Object object = getObject(..); 
if (object == null) { 
    response.getWriter().print("null"); 
    // also set the content type to application/json 
} 
return object; 

कुछ कर सकते हैं।

2

आपको एक त्रुटि के लिए एक ResponseEntity लौट सकते हैं और निर्दिष्ट HTTP स्थिति जब वस्तु रिक्त है।

आप वास्तव में शून्य मान आप जैक्सन कॉन्फ़िगर यह क्रमानुसार करने सकता लौटे (tkuty से कोड) की जरूरत है: मैं इस मदद आशा

<mvc:annotation-driven> 
    <mvc:message-converters register-defaults="true"> 
     <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> 
      <property name="objectMapper"> 
       <bean class="com.fasterxml.jackson.databind.ObjectMapper"> 
        <property name="serializationInclusion"> 
         <value type="com.fasterxml.jackson.annotation.JsonInclude.Include">NON_NULL</value> 
        </property> 
       </bean> 
      </property> 
     </bean> 
    </mvc:message-converters> 
</mvc:annotation-driven> 

+0

दुर्भाग्यवश कोई भी दृष्टिकोण मेरे मामले में काम नहीं करता है: 1) पहला व्यक्ति खाली प्रतिक्रिया देता है क्योंकि निम्न कोड मौजूद हैं: \t \t ऑब्जेक्ट बॉडी = responseEntity.getBody(); \t \t अगर (शरीर = अशक्त!) { \t \t \t writeWithMessageConverters (शरीर, returnType, inputMessage, outputMessage); \t \t} \t बाकी \t { \t \t \t // HttpServletResponse को फ्लश हेडर \t \t \t outputMessage.getBody(); \t \t}। तो यह सिर्फ निजीकरण के रूप में पूर्ववत है और लिखने से बचें WithMessageConverters विधि। – fashuser

+0

आपका दूसरा सुझाव काम नहीं करेगा, क्योंकि 'शून्य' कभी भी 'मैपिंग जैक्सन 2HttpMessageConverter' तक नहीं पहुंच पाएगा, यह 'RequestResponseBodyMethodProcessor' पर रुक जाएगा। –

-3

सबसे पहले, मैं सलाह देने के लिए आप इस तरह नहीं लिखना चाहिए:

@RequestMapping(value = "/someUrl.controller", method = RequestMethod.GET) 
public @ResponseBody Object getObject(@RequestParam("id") Long id) { 
    /* 
    */ 
} 

मानक कोड के रूप में यह सुनिश्चित करें। इसे आजमाएं:

@RequestMapping(value = "/someUrl.controller", method = RequestMethod.GET) 
@ResponseBody 
public Object getObject(@RequestParam("id") Long id) { 
    Object object = provider.getObject(id); 
    return object; 
} 

मुझे गुणवत्ता स्कैनर के साथ अनुभव है, इस तरह से आपको स्कैनर द्वारा मिली त्रुटि से बचने में मदद मिलती है। अपनी समस्या के बारे में, आप इसके बजाय POJO वापस करने के लिए ट्रांसफॉर्मर या addScala() को आजमा सकते हैं। मुझे इस परेशानी का सामना करना पड़ा, और एक सौदा किया! सौभाग्य।

+0

क्या आपका मतलब है विधि हस्ताक्षर के तहत एनोटेशन निर्दिष्ट करें, क्योंकि यह एक "डुप्लिकेट एनोटेशन @ रेस्पॉन्सबॉडी" संकलन त्रुटि को उत्तेजित करता है? धन्यवाद! – fashuser

+0

मेरा मतलब यह नहीं है कि आपको एक्सेसर के बाद और विधि के डेटाटाइप के बाद एनोटेशन नहीं डालना चाहिए। मेरे रास्ते का प्रयोग करें। गुणवत्ता स्कैनर (जैसे सोनारक्यूब) को पता चलेगा कि यह एक बड़ी त्रुटि है और इसे रिएक्टर होने की आवश्यकता है! मैंने इसका सामना किया और अनुभव प्राप्त किया। यह "डुप्लिकेट एनोटेशन" संकलन त्रुटि नहीं है। यह ठीक से संकलित होगा, लेकिन आपको अपना कोड मानकीकृत करना चाहिए। –

+0

यह एक त्रुटि कैसे है? यह कोड शैली की राय हो सकती है, लेकिन यह निश्चित रूप से एक त्रुटि नहीं है। और आपका उत्तर प्रश्न का उत्तर नहीं देता है। –

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