2012-11-13 10 views
11

के साथ हैंडल त्रुटि 404 मैं अपने वेब ऐप द्वारा फेंकने वाले अपवादों को संभालने के लिए @ExceptionHandler का उपयोग करता हूं, मेरे मामले में मेरा ऐप JSON क्लाइंट को त्रुटि प्रतिक्रियाओं के लिए HTTP status के साथ प्रतिक्रिया देता है।स्प्रिंग नियंत्रक

हालांकि, मैं error 404 को संभालने के लिए कैसे द्वारा नियंत्रित एक के साथ की तरह एक समान JSON उत्तर वापस जाने के लिए यह पता लगाने की कोशिश कर रहा हूँ @ExceptionHandler

अद्यतन:

मेरा मतलब है, जब किसी URL जो ऐसा नहीं करता मौजूद

उत्तर

2

सबसे आसान तरीका में निम्न कोड जोड़ें निम्न का उपयोग है इस विधि द्वारा, लेकिन अगर URL टाइप किया DispatcherServlet का URL मानचित्रण से परे है तो आप या तो उपयोग करने के लिए है:

<error-page> 
    <exception-type>404</exception-type> 
    <location>/404error.html</location> 
</error-page> 

या

विशेष प्रेषण सर्वर के लिए सभी मैपिंग को संभालने के लिए अपने डिस्पैचर सर्वेट मैपिंग यूआरएल में मैपिंग प्रदान करें।

+0

यह मेरे लिए काम नहीं करता है: मैंने अपने डिस्पैचर सर्वलेट के लिए मैपिंग सेट की है, लेकिन विधि ट्रिगर नहीं है ... – davioooh

+0

क्या एक ही कक्षा या माता-पिता वर्ग में विधि है जहां अनुरोध आया था? – Abhi

+0

नहीं, मैं एक वैश्विक हैंडलर स्थापित करने की कोशिश कर रहा हूं ... (http://stackoverflow.com/q/21884740/1061499) – davioooh

4
वसंत> 3.0 उपयोग @ResponseStatus साथ

पहुँचा जा सकता है

@ResponseStatus(value = HttpStatus.NOT_FOUND) 
    public class ResourceNotFoundException extends RuntimeException { 
    ... 
} 

    @Controller 
    public class MyController { 
    @RequestMapping..... 
    public void handleCall() { 
     if (isFound()) { 
     // do some stuff 
     } 
     else { 
       throw new ResourceNotFoundException(); 
     } 
    } 
} 
+0

मेरा मतलब है, जब कोई यूआरएल मौजूद नहीं है तो – xybrek

+0

तक पहुंच गया है 404 या नहीं मिला त्रुटि संदेश एक HTTP मानक प्रतिक्रिया कोड है जो दर्शाता है कि क्लाइंट सर्वर के साथ संवाद करने में सक्षम था, लेकिन सर्वर को अनुरोध नहीं मिला । –

+0

मेरा मतलब है, उदाहरण के लिए यह यूआरएल मौजूद है:/rest/doc/1 <= यह मौजूद है, हालांकि/बाकी/डॉक्टर/1/notexist <= मौजूद नहीं है (यह मेरा मतलब है) – xybrek

1

आप 404 त्रुटि को संभालने के लिए सर्वलेट मानक तरीका का उपयोग कर सकते हैं। यदि वह URL DispatcherServlet के दायरे तो किसी भी 404 गलत लिख या कुछ और पकड़ा हो जाएगा की वजह से भीतर है

@ExceptionHandler(Throwable.class) 
    public String handleAnyException(Throwable ex, HttpServletRequest request) { 
    return ClassUtils.getShortName(ex.getClass()); 
    } 

: पता लगाने के लिए web.xml

<error-page> 
    <exception-type>404</exception-type> 
    <location>/404error.html</location> 
</error-page> 
35

मैं वसंत 4.0 और जावा कॉन्फ़िगरेशन का उपयोग करता हूं। मेरे काम के कोड है:

@ControllerAdvice 
public class MyExceptionController { 
    @ExceptionHandler(NoHandlerFoundException.class) 
    public ModelAndView handleError404(HttpServletRequest request, Exception e) { 
      ModelAndView mav = new ModelAndView("/404"); 
      mav.addObject("exception", e); 
      //mav.addObject("errorcode", "404"); 
      return mav; 
    } 
} 

JSP में:

<div class="http-error-container"> 
     <h1>HTTP Status 404 - Page Not Found</h1> 
     <p class="message-text">The page you requested is not available. You might try returning to the <a href="<c:url value="/"/>">home page</a>.</p> 
    </div> 

Init परम config के लिए:

public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 
    @Override 
    public void customizeRegistration(ServletRegistration.Dynamic registration) { 
     registration.setInitParameter("throwExceptionIfNoHandlerFound", "true"); 
    } 
} 

या एक्सएमएल के माध्यम से:

<servlet> 
    <servlet-name>rest-dispatcher</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>throwExceptionIfNoHandlerFound</param-name> 
     <param-value>true</param-value> 
    </init-param> 
</servlet> 

देखें इसके अलावा: Spring MVC Spring Security and Error Handling

+0

यह सबसे अच्छा जवाब है, क्योंकि वसंत के साथ सबकुछ संभालने से आपको सभी कार्यक्षमता मिलती हैं एक बनाम एचटीएमएल पेज बनाम जावा के साथ त्रुटि को संभालना। – dev

+0

इसके लिए धन्यवाद, यह अब चीजों को करने का सही तरीका लगता है, हालांकि, यह मेरे लिए काम नहीं कर रहा है। यदि आपके पास समय है, तो क्या कोई मौका है कि आप मुझे बता सकते हैं कि मैं क्या गलत कर रहा हूं? http://stackoverflow.com/questions/28750038/returning-json-with-spring-on-404-in-xml-free-project –

+0

यदि आपके पास संसाधन हैंडलर कॉन्फ़िगर किया गया है और संसाधन नहीं मिला तो यह नहीं करता काम नहीं करता दुर्भाग्य से, संसाधन HttpRequestHandler कुछ प्रकार के संसाधन अपवाद को फेंकने के बजाय 404 प्रतिक्रिया भेजता है जिसे आप पकड़ सकते हैं। –

1
public final class ResourceNotFoundException extends RuntimeException { 

} 


@ControllerAdvice 
public class AppExceptionHandler { 
    @ExceptionHandler(ResourceNotFoundException.class) 
    @ResponseStatus(HttpStatus.NOT_FOUND) 
    public String handleNotFound() { 
     return "404"; 
    } 
} 

बस एक अपवाद, एक अपवाद हैन्डलर को परिभाषित करें, अपवाद को अपने व्यावसायिक कोड नियंत्रक से फेंक दें।

+0

यह मेरे स्प्रिंग 4 एप्लिकेशन में पूरी तरह से काम करता है, और वसंत के लिए स्टेटस कोड सेट करने के लिए उपयुक्त समाधान है 'NoHandlerFoundException' जैसे अपवाद अपवाद। – vallismortis

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