2014-10-07 6 views
5

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

मैं क्या चाहता हूं: कोई अनुरोध जिसके परिणामस्वरूप 405 त्रुटि को एक विशिष्ट नियंत्रक विधि में संभाला जाना चाहिए।

मैं क्या कोशिश की है:

  • "विधि = GET" मैपिंग उल्लेख से प्रत्येक के लिए एक समकक्ष के रूप में के साथ एक विधि। यह ठीक काम करता है, लेकिन मुझे प्रत्येक पथ के लिए एक वास्तविक अनुरोधण और विधि बनाने की आवश्यकता है जो केवल पोस्ट की अनुमति देता है। मुझे यह अनावश्यक डुप्लिकेशन और अव्यवस्था मिलती है।
  • एक वैश्विक 'पकड़' विधि (अनुरोधण/*): यह काम नहीं करता है, क्योंकि वसंत जीईटी विधि को केवल
  • के साथ निर्दिष्ट पथ पर गलत कॉल करने के लिए लेता है, अपवादों को संभालने के लिए एक अपवाद हैडलर-एनोटेटेड विधि कक्षा HttpRequestMethodNotSupportedException: यह काम नहीं करता है। ऐसा लगता है कि वसंत फेंकता है और इस अपवाद को पूरी तरह से अपने ढांचे कोड में पकड़ता है।
  • web.xml में अपना स्वयं का 405 निर्दिष्ट करें। यह सही नहीं है, क्योंकि मैं स्थिर त्रुटि पृष्ठ की बजाय अनुकूलित हैंडलिंग करना चाहता हूं।

उत्तर

7

मैं हैंडलर अपवाद रिजॉल्वर का उपयोग करने का सुझाव दूंगा। आप वसंत के DefaultHandlerExceptionResolver का उपयोग कर सकते हैं। handleHttpRequestMethodNotSupported() विधि ओवरराइड करें और अपना अनुकूलित view वापस करें। यह आपके सभी आवेदनों पर काम करेगा।

प्रभाव है कि आप अपने विकल्प 3. में उम्मीद कर रहे थे के करीब है कारण अपने @ExceptionHandler एनोटेट विधि कभी नहीं पकड़ता अपने अपवाद नहीं है क्योंकि इन ExceptionHandler एनोटेट तरीकों एक सफल स्प्रिंग नियंत्रक हैंडलर मैपिंग पाया जाता है के बाद लागू कर रहे हैं। हालांकि, इससे पहले आपका अपवाद उठाया गया है।

+2

यह सही है! एक चीज जिसे दूसरों को देखने की आवश्यकता हो सकती है, यह है कि यदि आप ऐसा करने का निर्णय लेते हैं और डिफॉल्ट हैंडलर एक्सेप्शन रीसोलवर ओवरराइड करते हैं, तो आपको इंटरफ़ेस ऑर्डर में निर्दिष्ट getOrder() विधि को ओवरराइड करना चाहिए। उस विधि में, आपको Integer.MAX_VALUE से किसी भी int को कम करना चाहिए। इस तथ्य का कारण यह है कि सबसे कम आदेश वाले हैंडलर को अपवाद पर पहला शॉट मिलता है। कोई बात नहीं धन्यवाद! – Zaan

4
Working Code: 

@ControllerAdvice 
public class GlobalExceptionController { 

    @ExceptionHandler(HttpRequestMethodNotSupportedException.class) 
    public ModelAndView handleError405(HttpServletRequest request, Exception e) { 
      ModelAndView mav = new ModelAndView("/405"); 
      mav.addObject("exception", e); 
      //mav.addObject("errorcode", "405"); 
      return mav; 
     } 

In Jsp page (405.jsp): 

    <div class="http-error-container"> 
     <h1>HTTP Status 405 - Request Method not Support</h1> 
     <p class="message-text">The request method does not support. <a href="<c:url value="/"/>">home page</a>.</p> 
    </div> 
संबंधित मुद्दे