नया उत्तर (2016-04-20)
स्प्रिंग बूट का उपयोग 1.3.1
नया चरण 1 - आवेदन के लिए निम्नलिखित गुणों को जोड़ना आसान और कम घुसपैठ है।
spring.mvc.throw-exception-if-no-handler-found=true
spring.resources.add-mappings=false
मौजूदा DispatcherServlet उदाहरण को संशोधित करने की तुलना में बहुत आसान है (नीचे के रूप में)! - जो '
यदि पूर्ण रीस्टफुल एप्लिकेशन के साथ काम कर रहे हैं, तो स्थैतिक संसाधनों की स्वचालित मैपिंग को अक्षम करना बहुत महत्वपूर्ण है क्योंकि यदि आप स्थैतिक संसाधनों को संभालने के लिए स्प्रिंग बूट के डिफ़ॉल्ट कॉन्फ़िगरेशन का उपयोग कर रहे हैं तो संसाधन हैंडलर अनुरोध को संभाल लेगा (यह अंतिम आदेश दिया गया है और मैप किया गया है / ** जिसका अर्थ है कि यह किसी भी अनुरोध को चुनता है जिसे किसी भी अन्य हैंडलर द्वारा नियंत्रित नहीं किया गया है) इसलिए डिस्पैचर सर्वलेट को अपवाद फेंकने का मौका नहीं मिलता है।
नया उत्तर (2015-12-04)
स्प्रिंग बूट का उपयोग 1.2.7
नया चरण 1 - मुझे "throExceptionIfNoHandlerFound" ध्वज को स्थापित करने का बहुत कम घुसपैठ वाला तरीका मिला। नीचे दिए गए DispatcherServlet प्रतिस्थापन कोड को अपने चरण आरंभीकरण वर्ग में इसके साथ बदलें:
@ComponentScan()
@EnableAutoConfiguration
public class MyApplication extends SpringBootServletInitializer {
private static Logger LOG = LoggerFactory.getLogger(MyApplication.class);
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(MyApplication.class, args);
DispatcherServlet dispatcherServlet = (DispatcherServlet)ctx.getBean("dispatcherServlet");
dispatcherServlet.setThrowExceptionIfNoHandlerFound(true);
}
इस मामले में, हम ध्वज को मौजूदा डिस्पैचरसर्वलेट पर सेट कर रहे हैं, जो स्प्रिंग बूट ढांचे द्वारा किसी भी ऑटो-कॉन्फ़िगरेशन को संरक्षित करता है।
एक और चीज़ जो मुझे मिली है - @EnableWebMvc एनोटेशन स्प्रिंग बूट के लिए घातक है। हां, यह एनोटेशन उन सभी नियंत्रक अपवादों को पकड़ने में सक्षम बनाता है जैसे कि नीचे वर्णित है, लेकिन यह सहायक ऑटो-कॉन्फ़िगरेशन का एक बहुत मारता है जो स्प्रिंग बूट सामान्य रूप से प्रदान करेगा। जब आप स्प्रिंग बूट का उपयोग करते हैं तो अत्यधिक सावधानी के साथ उस एनोटेशन का उपयोग करें।
मूल उत्तर:
बहुत अधिक शोध और बाद में यहां पोस्ट किए गए समाधानों पर (मदद के लिए धन्यवाद!) और स्प्रिंग कोड में रनटाइम ट्रेसिंग की कोई छोटी मात्रा नहीं है, मैंने आखिरकार एक कॉन्फ़िगरेशन पाया जो सभी अपवादों को संभाल लेगा (त्रुटियों को नहीं, लेकिन पढ़ें) 404s सहित।
चरण 1 - स्प्रिंगबूट को "हैंडलर नहीं मिला" स्थितियों के लिए एमवीसी का उपयोग बंद करने के लिए कहें। हम चाहते हैं कि स्प्रिंग ग्राहक के पास लौटने के बजाय एक अपवाद को फेंक दे, जिसे "/ त्रुटि" पर पुनर्निर्देशित किया जाए। ऐसा करने के लिए, आपको अपनी कॉन्फ़िगरेशन कक्षाओं में से एक में प्रवेश करना होगा:
// NEW CODE ABOVE REPLACES THIS! (2015-12-04)
@Configuration
public class MyAppConfig {
@Bean // Magic entry
public DispatcherServlet dispatcherServlet() {
DispatcherServlet ds = new DispatcherServlet();
ds.setThrowExceptionIfNoHandlerFound(true);
return ds;
}
}
इसका नकारात्मक पक्ष यह है कि यह डिफ़ॉल्ट डिस्पैचर सर्वलेट को बदल देता है। यह अभी तक हमारे लिए कोई समस्या नहीं है, कोई साइड इफेक्ट या निष्पादन समस्या नहीं है। यदि आप अन्य कारणों से डिस्पैचर सर्वलेट के साथ कुछ और करने जा रहे हैं, तो यह उनके लिए जगह है।
चरण 2 - अब जब स्प्रिंग बूट एक अपवाद को फेंक देगा जब कोई हैंडलर नहीं मिलता है, तो उस अपवाद को एकीकृत अपवाद हैंडलर में किसी अन्य के साथ संभाला जा सकता है:
@EnableWebMvc
@ControllerAdvice
public class ServiceExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(Throwable.class)
@ResponseBody
ResponseEntity<Object> handleControllerException(HttpServletRequest req, Throwable ex) {
ErrorResponse errorResponse = new ErrorResponse(ex);
if(ex instanceof ServiceException) {
errorResponse.setDetails(((ServiceException)ex).getDetails());
}
if(ex instanceof ServiceHttpException) {
return new ResponseEntity<Object>(errorResponse,((ServiceHttpException)ex).getStatus());
} else {
return new ResponseEntity<Object>(errorResponse,HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@Override
protected ResponseEntity<Object> handleNoHandlerFoundException(NoHandlerFoundException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
Map<String,String> responseBody = new HashMap<>();
responseBody.put("path",request.getContextPath());
responseBody.put("message","The URL you have reached is not in service at this time (404).");
return new ResponseEntity<Object>(responseBody,HttpStatus.NOT_FOUND);
}
...
}
ध्यान रखें कि मुझे लगता है कि "@EnableWebMvc" एनोटेशन यहाँ महत्वपूर्ण है। ऐसा लगता है कि इसके बिना कोई भी काम नहीं करता है। और वह यह है - आपका स्प्रिंग बूट ऐप अब उपर्युक्त हैंडलर वर्ग में 404s सहित सभी अपवादों को पकड़ लेगा और आप कृपया उनके साथ ऐसा कर सकते हैं।
एक अंतिम बिंदु - फेंकी गई त्रुटियों को पकड़ने के लिए इसे प्राप्त करने का कोई तरीका प्रतीत नहीं होता है। मेरे पास त्रुटियों को पकड़ने के लिए पहलुओं का उपयोग करने का एक निराला विचार है और उन्हें अपवादों में बदलना है कि उपरोक्त कोड फिर से निपट सकता है, लेकिन मेरे पास अभी तक वास्तव में इसे लागू करने का प्रयास करने का समय नहीं है। आशा है कि यह किसी की मदद करता है।
किसी भी टिप्पणी / सुधार / संवर्द्धन की सराहना की जाएगी।