2013-09-02 8 views
6

मेरे पास स्प्रिंग एमवीसी पर्यावरण में अपवादों की एक विशेष श्रेणी को संभालने का एक तरीका है। metod (सरलीकृत) कार्यान्वयन इस प्रकाररिसेन्सबॉडी के साथ अपवाद हैडलर: विधि शरीर में प्रतिक्रिया प्रतिक्रिया सेट

@ExceptionHandler(AjaxException.class) 
@ResponseStatus(value=HttpStatus.BAD_REQUEST) 
@ResponseBody 
public Exception handleException(AjaxException ex) { 
    return ex; 
} 

यह वह जगह है ठीक काम करता है, लेकिन एक अलग ResponseStatus मैं एक नया हैंडलिंग विधि बनाने के लिए वापस जाने के लिए।

क्या रिटर्न प्रकार को बदले बिना @ResponseStatus एनोटेशन का उपयोग करने के बजाय विधि निकाय के अंदर प्रतिक्रिया स्थिति बदलना संभव है?

यदि नहीं, तो क्या रिटर्न प्रकार को बदलकर एक ही परिणाम प्राप्त करना संभव है (शायद अपवाद वर्ग को क्रमबद्ध करना और इसे स्ट्रिंग के रूप में वापस करना)?

उत्तर

4

विधि हस्ताक्षर में HttpServletResponse जोड़ें और बस setStatus विधि पर कॉल करें।

@ExceptionHandler(AjaxException.class) 
@ResponseBody 
public Exception handleException(AjaxException ex, HttpServletResponse response) { 
    response.setStatus(HttpServletResponse.SC_BAD_REQUEST); 
    return ex; 
} 

ऐसा कुछ काम करना चाहिए।

+0

सही! मुझे यह समाधान स्वयं मिला, फिर भी एप्लिकेशन गलत चल रहा था ... समस्या कहीं और थी – Gabber

2

आसान किया, वसंत दस्तावेज थोड़ा और सावधानी से पढ़ना।

HttpServletResponse को ऑब्जेक्ट पैरामीटर के रूप में पास करना संभव है। रिटर्न कोड सेट करना ऐसी ऑब्जेक्ट में संभव है। वाक्यविन्यास निम्नानुसार है:

@ExceptionHandler(AjaxException.class) 
@ResponseBody 
public AjaxException handleException(AjaxException ex,HttpServletResponse response) { 
      //test code ahead, not part of the solution 

      //throw new NullPointerException(); 

      //end of test code 


    response.setStatus(404);//example 
    return ex; 
} 

यह निर्दिष्ट http रिटर्न कोड के साथ अपवाद के जेसन क्रमबद्धता को वापस कर देगा।

संपादित करें: मैंने कल यह जवाब हटा दिया क्योंकि यह समाधान काम नहीं कर रहा था। समस्या थोड़ी चालक थी: जब आप इस तरह के अपवाद का प्रबंधन करते हैं, तो अपवाद हैडलर के साथ एनोटेटेड विधि स्वयं को अपवाद फेंक देती है तो फेंक दिया अपवाद अनदेखा कर दिया जाता है और इसके बजाय मूल अपवाद फेंक दिया जाता है।

मेरा कोड किसी भी तरह से मेरे द्वारा पोस्ट किए गए समाधान की तरह था (यह विधि की शुरुआत में अपवाद फेंक दिया गया था), इसलिए मैं जेसन आउटपुट नहीं देख सका, मानक वसंत अपवाद हैंडलर को इसके बजाए निकाल दिया गया था। हल करने के लिए मैंने बस अपवाद फेंकने की कोशिश की और सबकुछ ठीक था।

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