दिलचस्प पोस्ट
अभिव्यक्ति। रनटाइम पर लैम्ब्डा और क्वेरी जनरेशन, सरल "कहां" उदाहरण सर्वश्रेष्ठ अभ्यास: अभिविन्यास परिवर्तन के दौरान AsyncTask मैं HTML संस्थाओं को तेजी से कैसे डीकोड कर सकता हूं? targetSdkVersion सेटिंग फ़ंक्शन ऑब्जेक्ट को कॉल करते समय तर्क मूल्यांकन के आदेश की गारंटी कैसे दें? jQuery के jquery-1.10.2.min.map एक ट्रिगर है 404 (नहीं मिला) जावा प्रतिबिंब प्रदर्शन निर्दिष्ट मान य्याय-एमएम-डीडी के लिए आवश्यक प्रारूप के अनुरूप नहीं है JQuery के datepicker के साथ विशिष्ट श्रेणी में दिनांक हाइलाइट करें जावास्क्रिप्ट के साथ एक एड्रेस बार बदलने का मैं कैसे पता लगा सकता हूं? Data.frame की प्रत्येक पंक्ति को दोहराएं और प्रत्येक पंक्ति के लिए नकल की संख्या निर्दिष्ट करें स्पष्ट रूप से एक पायथन सूची या ट्यूपल से आइटम का चयन करें स्प्लिट डेटाफ्रेम एकाधिक आउटपुट फाइलों में मंडल-आयत टकराव का पता लगाने (चौराहे) PHP में एक अधिक सुंदर / जानकारीपूर्ण var_dump विकल्प?

स्प्रिंग बूट बाकी सेवा अपवाद हैंडलिंग

मैं एक बड़े पैमाने पर REST सेवाएं सर्वर स्थापित करने की कोशिश कर रहा हूं हम स्प्रिंग बूट 1.2.1 स्प्रिंग 4.1.5, और जावा 8 का प्रयोग कर रहे हैं। हमारे नियंत्रक @ रेटकंट्रोलर और मानक @ अनुरोधमैपिंग एनोटेशन को लागू कर रहे हैं।

मेरी समस्या यह है कि स्प्रिंग बूट "/ त्रुटि" के नियंत्रक अपवाद के लिए एक डिफ़ॉल्ट पुनर्निर्देशन सेट करता है डॉक्स से:

वसंत बूट एक / त्रुटि मैपिंग डिफ़ॉल्ट रूप से प्रदान करता है जो सभी त्रुटियों को समझदार तरीके से संभालता है, और यह सर्विसलेट कंटेनर में एक 'वैश्विक' त्रुटि पृष्ठ के रूप में पंजीकृत है

Node.js के साथ REST अनुप्रयोगों को लिखते हुए वर्षों से आ रहा है, यह मेरे लिए, कुछ भी समझदार है। किसी भी अपवाद एक सेवा अंत बिंदु प्रतिक्रिया में वापस आना चाहिए। मुझे समझ में नहीं आ रहा है कि आप एक ऐसे रीडायरेक्ट को भेजते हैं जो एक कोनेरी या JQuery एसपीए उपभोक्ता की संभावना है जो केवल एक जवाब की तलाश कर रहा है और किसी रीडायरेक्ट पर कोई कार्रवाई नहीं कर सकता या नहीं करेगा।

मैं क्या करना चाहता हूं एक वैश्विक त्रुटि हैंडलर स्थापित किया गया है जो कोई भी अपवाद ले सकता है – या तो प्रयोजन से मैपिंग पद्धति या वसंत द्वारा उत्पन्न ऑटो (404 अगर अनुरोध पथ हस्ताक्षर के लिए कोई हैंडलर विधि नहीं मिलती है) से निकाल दिया जाता है, और एक मानक किसी भी MVC रीडायरेक्ट के बिना ग्राहक को प्रारूपित त्रुटि प्रतिसाद (400, 500, 503, 404)। विशेष रूप से, हम त्रुटि लेने जा रहे हैं, इसे यूएआईडी के साथ नोएसक्यूएल में लॉग इन करें, फिर क्लाइंट को सही एचटीटीपी त्रुटि कोड पर वापस लौटें, जो यूएसआईडी में प्रवेश एंट्री के यूयूआईडी में है।

यह कैसे करना है पर दस्तावेज़ अस्पष्ट हैं। ऐसा लगता है कि आपको या तो अपने खुद के त्रुटि नियंत्रक का कार्यान्वयन करना है या किसी फ़ैशन में कंट्रोलर एडवाइस का उपयोग करना है, लेकिन मैंने जो भी उदाहरण देखे हैं, उसमें कुछ प्रकार की त्रुटि मैपिंग की प्रतिक्रिया को अग्रेषित करना शामिल है, जो कि मदद नहीं करता है। अन्य उदाहरणों का सुझाव है कि आपको हर अपवाद प्रकार को सूचीबद्ध करना होगा, जिसे आप बस "थ्रोएबल" लिस्टिंग और सब कुछ प्राप्त करने के बजाय संभाल करना चाहते हैं

क्या कोई मुझे बता सकता है कि मुझे क्या याद आ गया है, या सही दिशा में मुझे इंगित करता है कि श्रृंखला के सुझाव के बिना यह कैसे करें कि नोड। जेएस से निपटना आसान होगा?

वेब के समाधान से एकत्रित समाधान "स्प्रिंग बूट बाकी सेवा अपवाद हैंडलिंग"

परिशिष्ट (4/20/16)

एक अनाम उपयोगकर्ता ने एक संपादन का सुझाव दिया और अस्वीकार कर दिया, लेकिन उनका सुझाव अच्छा और सहायक दिखता है इसलिए मैं इसे जोड़ रहा हूं:

स्प्रिंग बूट 1.3.1 .RELEASE का उपयोग करना

नया चरण 1 – आवेदन करने के लिए निम्नलिखित गुण जोड़ने के लिए आसान और कम दखल है।

spring.mvc.throw-exception-if-no-handler-found=true spring.resources.add-mappings=false 

मौजूदा डिस्पैचर सर्टलेट उदाहरण को संशोधित करने से बहुत आसान (नीचे)! – जो '

यदि पूर्ण प्रफुल्लित आवेदन के साथ काम करना है, तो स्थैतिक संसाधनों के स्वचालित मैपिंग को अक्षम करना बहुत महत्वपूर्ण है क्योंकि अगर आप स्थाई संसाधनों से निपटने के लिए स्प्रिंग बूट की डिफ़ॉल्ट कॉन्फ़िगरेशन का उपयोग कर रहे हैं, तो संसाधन हैंडलर अनुरोध को संभाल करेगा (यह अंतिम का आदेश दिया गया है और / ** जिसका मतलब है कि यह किसी ऐसे अनुरोध को उठाता है जो आवेदन में किसी अन्य हैंडलर द्वारा प्रबंधित नहीं किया गया है) ताकि डिस्पैचर सर्वलेट को अपवाद फेंकने का मौका न मिले।


नया उत्तर (12/04/15)

स्प्रिंग बूट 1.2.7 .RELEASE का उपयोग करना

नया चरण 1 – मुझे "throExceptionIfNoHandlerFound" ध्वज सेट करने का एक बहुत कम घुसपैठ तरीका मिला डिस्पैचर सर्बिल प्रतिस्थापन कोड को नीचे बदलें (चरण 1) इस के साथ अपने आवेदन प्रारंभिक वर्ग में:

 @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 एनोटेशन स्प्रिंग बूट के लिए घातक है हां, ये एनोटेशन नीचे बताए गए सभी नियंत्रक अपवादों को पकड़ने में सक्षम होने जैसी चीजों को सक्षम करता है, लेकिन यह स्प्रिंग बूट सामान्य तौर पर उपलब्ध कराए जाने वाले उपयोगी ऑटो कॉन्फ़िगरेशन को भी मारता है। स्प्रिंग बोट का उपयोग करते समय अत्यंत सावधानी से उस टिप्पणी का उपयोग करें


मूल उत्तर:

बहुत अधिक शोध और समाधान के बाद यहां पर पोस्ट किया गया (मदद के लिए धन्यवाद!) और स्प्रिंग कोड में ट्राईट होने की कोई छोटी राशि नहीं है, अंत में मुझे एक कॉन्फ़िगरेशन मिला है जो सभी अपवादों को संभालता है (त्रुटियों को नहीं, पर पढ़ा) 404 एस सहित

चरण 1 – "हैंडलर नहीं मिला" स्थितियों के लिए MVC का उपयोग करना बंद करने के लिए स्प्रिंगबूट को बताएं हम स्प्रिंग को क्लाइंट को "/ त्रुटि" पर रीडायरेक्ट करने के बजाय वापस लौटने के बजाय एक अपवाद फेंकना चाहते हैं। ऐसा करने के लिए, आपके पास एक कॉन्फ़िगरेशन क्लासेस में एक प्रविष्टि की आवश्यकता है:

 // NEW CODE ABOVE REPLACES THIS! (12/04/15) @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" एनोटेशन महत्वपूर्ण है यहां। ऐसा लगता है कि यह बिना कोई भी काम करता है। और यही है – आपके स्प्रिंग बूट ऐप अब उपरोक्त हैंडलर वर्ग में 404 एस सहित सभी अपवादों को पकड़ेगा और आप कृपया उनके साथ ऐसा कर सकते हैं जैसे आप कृपया।

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

किसी भी टिप्पणी / सुधार / संवर्द्धन की सराहना की जाएगी।

आसान अपवाद हैंडलिंग के लिए स्प्रिंग बूट 1.4+ नए कूल कक्षाओं के साथ जोड़ा गया जो बॉयलरप्लेट कोड को हटाने में मदद करता है।

एक नया @RestControllerAdvice अपवाद हैंडलिंग के लिए प्रदान किया गया है, यह @ResponseBody और @ResponseBody का संयोजन है आप @ResponseBody @ExceptionHandler पद्धति पर @ResponseBody को निकाल सकते हैं जब इस नई एनोटेशन का उपयोग करें

अर्थात

 @RestControllerAdvice public class GlobalControllerExceptionHandler { @ExceptionHandler(value = { Exception.class }) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public ApiErrorResponse unknownException(Exception ex, WebRequest req) { return new ApiErrorResponse(...); } } 

@EnableWebMvc एनोटेशन जोड़ने और आवेदन करने के लिए निम्नलिखित 404 त्रुटियों को संभालने के लिए। @EnableWebMvc पर्याप्त था:
spring.mvc.throw-exception-if-no-handler-found=true

आप यहां स्रोतों के साथ ढूंढ सकते हैं और खेल सकते हैं:
https://github.com/magiccrafter/spring-boot-exception-handling

मुझे लगता है कि ResponseEntityExceptionHandler आपकी आवश्यकताओं को पूरा करता है। HTTP 400 के कोड का नमूना टुकड़ा:

 @ControllerAdvice public class MyExceptionHandler extends ResponseEntityExceptionHandler { @ResponseStatus(value = HttpStatus.BAD_REQUEST) @ExceptionHandler({HttpMessageNotReadableException.class, MethodArgumentNotValidException.class, HttpRequestMethodNotSupportedException.class}) public ResponseEntity<Object> badRequest(HttpServletRequest req, Exception exception) { // ... } } 

आप इस पोस्ट को देख सकते हैं

इस कोड के बारे में क्या? मैं 404 त्रुटियों को पकड़ने के लिए फ़ॉलबैक अनुरोध मैपिंग का उपयोग करता हूं

 @Controller @ControllerAdvice public class ExceptionHandlerController { @ExceptionHandler(Exception.class) public ModelAndView exceptionHandler(HttpServletRequest request, HttpServletResponse response, Exception ex) { //If exception has a ResponseStatus annotation then use its response code ResponseStatus responseStatusAnnotation = AnnotationUtils.findAnnotation(ex.getClass(), ResponseStatus.class); return buildModelAndViewErrorPage(request, response, ex, responseStatusAnnotation != null ? responseStatusAnnotation.value() : HttpStatus.INTERNAL_SERVER_ERROR); } @RequestMapping("*") public ModelAndView fallbackHandler(HttpServletRequest request, HttpServletResponse response) throws Exception { return buildModelAndViewErrorPage(request, response, null, HttpStatus.NOT_FOUND); } private ModelAndView buildModelAndViewErrorPage(HttpServletRequest request, HttpServletResponse response, Exception ex, HttpStatus httpStatus) { response.setStatus(httpStatus.value()); ModelAndView mav = new ModelAndView("error.html"); if (ex != null) { mav.addObject("title", ex); } mav.addObject("content", request.getRequestURL()); return mav; } } 

डिफ़ॉल्ट रूप से वसंत बूट में जेसनसन त्रुटि विवरण देता है।

 curl -v localhost:8080/greet | json_pp [...] < HTTP/1.1 400 Bad Request [...] { "timestamp" : 1413313361387, "exception" : "org.springframework.web.bind.MissingServletRequestParameterException", "status" : 400, "error" : "Bad Request", "path" : "/greet", "message" : "Required String parameter 'name' is not present" } 

यह सभी तरह के अनुरोध मैपिंग त्रुटियों के लिए काम करता है। इस लेख को देखें http://www.jayway.com/2014/10/19/spring-boot-error-responses/

अगर आप इसे नोएसक्यूएल में लॉग ऑन करना चाहते हैं आप @ कंट्रोलर ऐडवाइस बना सकते हैं, जहां आप इसे लॉग करेंगे और फिर अपवाद को फिर से फेंक देंगे। दस्तावेज़ीकरण में उदाहरण है: https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc

REST नियंत्रकों के लिए, मैं Zalando Problem Spring Web का उपयोग करने की सलाह देता हूं

https://github.com/zalando/problem-spring-web

यदि स्प्रिंग बूट कुछ ऑटो-कॉन्फ़िगरेशन को एम्बेड करने का लक्ष्य रखता है, तो यह लाइब्रेरी अपवाद हैंडलिंग के लिए अधिक करता है। आपको बस निर्भरता जोड़ने की आवश्यकता है:

 <dependency> <groupId>org.zalando</groupId> <artifactId>problem-spring-web</artifactId> <version>LATEST</version> </dependency> 

और फिर अपने अपवादों (या डिफ़ॉल्ट रूप से प्रदान किए गए लोगों का उपयोग करें) के लिए एक या अधिक सलाह गुणों को परिभाषित करें

 public interface NotAcceptableAdviceTrait extends AdviceTrait { @ExceptionHandler default ResponseEntity<Problem> handleMediaTypeNotAcceptable( final HttpMediaTypeNotAcceptableException exception, final NativeWebRequest request) { return Responses.create(Status.NOT_ACCEPTABLE, exception, request); } } 

इसके बाद आप अपवाद निपटने के लिए नियंत्रक सलाह परिभाषित कर सकते हैं:

 @ControllerAdvice class ExceptionHandling implements MethodNotAllowedAdviceTrait, NotAcceptableAdviceTrait { } 

यद्यपि यह एक पुराना प्रश्न है, मैं इस पर अपने विचार साझा करना चाहूंगा। मुझे उम्मीद है, यह आप में से कुछ के लिए उपयोगी होगा

मैं वर्तमान में एक REST एपीआई का निर्माण कर रहा हूं जो स्प्रिंग बूट 1.5.2.RELEASE का स्प्रिंग फ्रेमवर्क 4.3.7 .RELEASE के साथ उपयोग करता है मैं जावा कॉन्फ़िगरेशन दृष्टिकोण का उपयोग करता हूं (जैसा कि XML कॉन्फ़िगरेशन के विपरीत है) इसके अलावा, मेरा परियोजना @RestControllerAdvice annotation (नीचे बाद में देखें) का उपयोग करके एक वैश्विक अपवाद हैंडलिंग तंत्र का उपयोग करता है

मेरा प्रोजेक्ट आपके पास एक ही आवश्यकता है: मैं चाहता हूं कि मेरी REST एपीआई एपीआई क्लाइंट के HTTP प्रतिक्रिया में एक HTTP 404 Not Found साथ एक साथ HTTP 404 Not Found पाई जो कि एक यूआरएल के लिए अनुरोध भेजने का प्रयास करता है जो मौजूद नहीं है। मेरे मामले में, JSON पेलोड इस तरह दिखता है (जो स्पष्ट रूप से स्प्रिंग बूट डिफॉल्ट से अलग है, बीटीडब्ल्यू।):

 { "code": 1000, "message": "No handler found for your request.", "timestamp": "2017-11-20T02:40:57.628Z" } 

आखिरकार मैंने इसे काम किया यहाँ मुख्य कार्य करने के लिए आपको संक्षेप में करना है:

  • सुनिश्चित करें कि NoHandlerFoundException फेंक दिया जाता है, यदि एपीआई क्लाइंट यूआरएल को कॉल करता है जिसके लिए कोई हेन्डलर पद्धति मौजूद नहीं है (नीचे चरण 1 देखें)।
  • एक कस्टम त्रुटि श्रेणी (मेरे मामले में ApiError ) ApiError , जिसमें सभी डेटा शामिल हैं जिन्हें API क्लाइंट पर लौटा जाना चाहिए (चरण 2 देखें)।
  • अपवाद हैंडलर बनाएं, जो NoHandlerFoundException अपवाद पर प्रतिक्रिया करता है और एपीआई ग्राहक को एक उचित त्रुटि संदेश देता है (चरण 3 देखें)।
  • इसके लिए एक परीक्षण लिखें और सुनिश्चित करें कि यह काम करता है (चरण 4 देखें)

ठीक है, अब विवरणों पर:

चरण 1: एप्लिकेशन को कॉन्फ़िगर करें। प्रॉपर्टीज़

मुझे प्रोजेक्ट के application.properties में निम्नलिखित दो कॉन्फ़िगरेशन सेटिंग्स जोड़नी application.properties फ़ाइल:

 spring.mvc.throw-exception-if-no-handler-found=true spring.resources.add-mappings=false 

यह सुनिश्चित करता है कि, NoHandlerFoundException उन मामलों में फेंक दिया जाता है जहां क्लाइंट उस URL तक पहुंचने का प्रयास करता है जिसके लिए कोई नियंत्रक विधि मौजूद नहीं है जो अनुरोध को संभालने में सक्षम होगा।

चरण 2: एपीआई त्रुटियों के लिए कक्षा बनाएं

मैंने यूज पारसवीव के ब्लॉग पर इस लेख में सुझाए गए वर्ग के समान एक वर्ग बनाया है। यह क्लास एपीआई त्रुटि का प्रतिनिधित्व करता है। त्रुटि के मामले में यह जानकारी HTTP प्रतिसाद बॉडी में ग्राहक को भेजी जाती है।

 public class ApiError { private int code; private String message; private Instant timestamp; public ApiError(int code, String message) { this.code = code; this.message = message; this.timestamp = Instant.now(); } public ApiError(int code, String message, Instant timestamp) { this.code = code; this.message = message; this.timestamp = timestamp; } // Getters and setters here... } 

चरण 3: एक वैश्विक अपवाद हैंडलर बनाएं / कॉन्फ़िगर करें

मैं अपवादों को संभालने के लिए निम्नलिखित वर्ग का उपयोग करता हूं (सादगी के लिए, मैंने आयात स्टेटमेंट, लॉगिंग कोड और कुछ अन्य, गैर-संगत कोड के टुकड़े हटा दिए हैं):

 @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(NoHandlerFoundException.class) @ResponseStatus(HttpStatus.NOT_FOUND) public ApiError noHandlerFoundException( NoHandlerFoundException ex) { int code = 1000; String message = "No handler found for your request."; return new ApiError(code, message); } // More exception handlers here ... } 

चरण 4: एक परीक्षण लिखें

मैं यह सुनिश्चित करना चाहता हूं, एपीआई हमेशा सही त्रुटि संदेशों को कॉलिंग क्लाइंट को देता है, यहां तक ​​कि विफलता के मामले में। इस प्रकार, मैंने इस तरह एक परीक्षण लिखा था:

 @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SprintBootTest.WebEnvironment.RANDOM_PORT) @AutoConfigureMockMvc @ActiveProfiles("dev") public class GlobalExceptionHandlerIntegrationTest { public static final String ISO8601_DATE_REGEX = "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$"; @Autowired private MockMvc mockMvc; @Test @WithMockUser(roles = "DEVICE_SCAN_HOSTS") public void invalidUrl_returnsHttp404() throws Exception { RequestBuilder requestBuilder = getGetRequestBuilder("/does-not-exist"); mockMvc.perform(requestBuilder) .andExpect(status().isNotFound()) .andExpect(jsonPath("$.code", is(1000))) .andExpect(jsonPath("$.message", is("No handler found for your request."))) .andExpect(jsonPath("$.timestamp", RegexMatcher.matchesRegex(ISO8601_DATE_REGEX))); } private RequestBuilder getGetRequestBuilder(String url) { return MockMvcRequestBuilders .get(url) .accept(MediaType.APPLICATION_JSON); } 

@ActiveProfiles("dev") एनोटेशन को छोड़ा जा सकता है। मैं इसे केवल तभी उपयोग करता हूं जब मैं अलग-अलग प्रोफाइल के साथ काम करता हूं। RegexMatcher एक कस्टम हैमरिकस्ट मैचर है जो मैं टाइमस्टैंप फ़ील्ड को बेहतर तरीके से प्रबंधित करने के लिए उपयोग करता हूं। यहां कोड है (मैं इसे यहां पाया):

 public class RegexMatcher extends TypeSafeMatcher<String> { private final String regex; public RegexMatcher(final String regex) { this.regex = regex; } @Override public void describeTo(final Description description) { description.appendText("matches regular expression=`" + regex + "`"); } @Override public boolean matchesSafely(final String string) { return string.matches(regex); } // Matcher method you can call on this matcher class public static RegexMatcher matchesRegex(final String string) { return new RegexMatcher(regex); } } 

मेरे पक्ष से कुछ और नोट:

  • @EnableWebMvc पर कई अन्य पोस्ट में, लोगों ने @EnableWebMvc एनोटेशन सेट करने का सुझाव दिया। यह मेरे मामले में जरूरी नहीं था।
  • यह दृष्टिकोण MockMvc (ऊपर परीक्षण देखें) के साथ अच्छी तरह से काम करता है।

dispatcherServlet.setThrowExceptionIfNoHandlerFound(true); साथ समाधान। dispatcherServlet.setThrowExceptionIfNoHandlerFound(true); और @EnableWebMvc @ControllerAdvice ने मेरे लिए स्प्रिंग बूट 1.3.1 के साथ काम किया, जबकि 1.2.7 पर काम नहीं कर रहा था