दिलचस्प पोस्ट
Z80 पर अतिप्रवाह और कैर्री झंडे सेलेनियम का उपयोग कर ब्राउज़र प्रमाणीकरण को संभालना एएसपी.नेट एमवीसी जेएसनआरसल्ट तिथि प्रारूप क्यों सी # संदर्भों की वापसी का समर्थन नहीं करता है? सरणी में अंतिम कुंजी कैसे प्राप्त करें? Enum विशेषता से enum प्राप्त करें क्या गोटो अभी भी हानिकारक माना जाता है? कैसे प्रोग्रामिंग के आईपी पता को पाने के लिए क्या है "प्रकार 'बंद का वस्तु' चमकदार में त्रुटि सेने योग्य नहीं है? पेपरक्लिप द्वारा यूआरएल से चित्र सहेजें Php स्ट्रिंग से नियंत्रण अक्षर निकालें ToLocaleDateString () IE11 में परिवर्तन Cplusplus.com में क्या गलत है? JQuery शो और माउस को क्लिक करें (एनीमेट करें) पर डिवेल पर छिपाएं PHP से कॉल करें और वापसी कोड प्राप्त करें

Spring @ExceptionHandler @ResponseBody के साथ काम नहीं करता है

मैं एक आराम नियंत्रक के लिए एक वसंत अपवाद हैंडलर को कॉन्फ़िगर करने की कोशिश करता हूं जो कि इनकमिंग स्वीकार हेडर पर आधारित एक्सएमएल और जेएसओ दोनों के लिए एक नक्शा प्रदान करता है। यह अभी 500 servlet अपवाद फेंकता है

यह काम करता है, यह home.jsp उठाता है:

@ExceptionHandler(IllegalArgumentException.class) public String handleException(final Exception e, final HttpServletRequest request, Writer writer) { return "home"; } 

यह काम नहीं करता:

 @ExceptionHandler(IllegalArgumentException.class) public @ResponseBody Map<String, Object> handleException(final Exception e, final HttpServletRequest request, Writer writer) { final Map<String, Object> map = new HashMap<String, Object>(); map.put("errorCode", 1234); map.put("errorMessage", "Some error message"); return map; } 

एक ही नियंत्रक में संबंधित कनवर्टर कार्यों के माध्यम से XML या json के जवाब की नकल:

 @RequestMapping(method = RequestMethod.GET, value = "/book/{id}", headers = "Accept=application/json,application/xml") public @ResponseBody Book getBook(@PathVariable final String id) { logger.warn("id=" + id); return new Book("12345", new Date(), "Sven Haiges"); } 

किसी को?

Solutions Collecting From Web of "Spring @ExceptionHandler @ResponseBody के साथ काम नहीं करता है"

आपका तरीका

 @ExceptionHandler(IllegalArgumentException.class) public @ResponseBody Map<String, Object> handleException(final Exception e, final HttpServletRequest request, Writer writer) 

काम नहीं करता क्योंकि इसमें गलत रिटर्न प्रकार है I @ExceptionHandler विधियों में केवल दो वैध वापसी प्रकार हैं:

  • तार
  • ModelAndView।

अधिक जानकारी के लिए http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html देखें। यहां लिंक से विशिष्ट टेक्स्ट दिया गया है:

रिटर्न प्रकार एक स्ट्रिंग हो सकता है, जिसे एक दृश्य नाम या मॉडल ऐंडव्यू ऑब्जेक्ट के रूप में समझा जाता है।

टिप्पणी के जवाब में

थानक्स, मुझे लगता है कि यह बहुत अधिक है। यह बुरा है … किसी भी विचार xml / json प्रारूप में स्वतः अपवाद कैसे प्रदान करें? – स्वेन हाइगेस 7 घंटे पहले

यहाँ मैंने जो किया है (मैंने वास्तव में इसे स्काला में किया है इसलिए मुझे यकीन नहीं है कि वाक्यविन्यास बिल्कुल सही है, लेकिन आपको सारांश प्राप्त करना चाहिए)।

 @ExceptionHandler(Throwable.class) @ResponseBody public void handleException(final Exception e, final HttpServletRequest request, Writer writer) { writer.write(String.format( "{\"error\":{\"java.class\":\"%s\", \"message\":\"%s\"}}", e.getClass(), e.getMessage())); } 

थानक्स, मुझे लगता है कि यह बहुत अधिक है। यह बुरा है … किसी भी विचार xml / json प्रारूप में स्वतः अपवाद कैसे प्रदान करें?

स्प्रिंग 3.0 मैपिंगजैकसनजसनदृश्य में नया यह हासिल करने के लिए उपयोग किया जा सकता है:

 private MappingJacksonJsonView jsonView = new MappingJacksonJsonView(); @ExceptionHandler(Exception.class) public ModelAndView handleAnyException( Exception ex ) { return new ModelAndView( jsonView, "error", new ErrorMessage( ex ) ); } 

यह एक निश्चित बग (एसपीआर -6902 @ रेस्पॉन्सबॉडी @ एक्सेप्शनहैंडलर के साथ काम नहीं करता है) लगता है

https://jira.springsource.org/browse/SPR-6902

हालांकि 3.1 एम 1 में फिक्स्ड …

मैं स्प्रिंग 3.2.4 का उपयोग कर रहा हूं। समस्या का मेरा समाधान यह सुनिश्चित करना था कि अपवाद हैंडलर से जिस ऑब्जेक्ट को मैं वापस लौटा रहा था, वह मिल गया था।

गेटर्स बिना जैक्सन को जेएसओएन को ऑब्जेक्ट को सीरियल करने में असमर्थ था।

मेरे कोड में, निम्नलिखित अपवादहैंडलर के लिए:

 @ExceptionHandler(RuntimeException.class) @ResponseBody public List<ErrorInfo> exceptionHandler(Exception exception){ return ((ConversionException) exception).getErrorInfos(); } 

मुझे यह सुनिश्चित करने की आवश्यकता है कि मेरे ErrorInfo ऑब्जेक्ट में गेटर्स थे:

 package com.pelletier.valuelist.exception; public class ErrorInfo { private int code; private String field; private RuntimeException exception; public ErrorInfo(){} public ErrorInfo(int code, String field, RuntimeException exception){ this.code = code; this.field = field; this.exception = exception; } public int getCode() { return code; } public String getField() { return field; } public String getException() { return exception.getMessage(); } } 

यदि आप संदेश कनवर्टर का इस्तेमाल कर रहे हैं, तो प्रतिक्रिया सामग्री के रूप में त्रुटि ऑब्जेक्ट मार्शल करने के लिए निम्न समाधान हो सकता है

 @ExceptionHandler(IllegalArgumentException.class) public String handleException(final Exception e, final HttpServletRequest request) { final Map<String, Object> map = new HashMap<String, Object>(); map.put("errorCode", 1234); map.put("errorMessage", "Some error message"); request.setAttribute("error", map); return "forward:/book/errors"; //forward to url for generic errors } //set the response status and return the error object to be marshalled @SuppressWarnings("unchecked") @RequestMapping(value = {"/book/errors"}, method = {RequestMethod.POST, RequestMethod.GET}) public @ResponseBody Map<String, Object> showError(HttpServletRequest request, HttpServletResponse response){ Map<String, Object> map = new HashMap<String, Object>(); if(request.getAttribute("error") != null) map = (Map<String, Object>) request.getAttribute("error"); response.setStatus(Integer.parseInt(map.get("errorCode").toString())); return map; } 

व्याख्यान MethodHandlerExceptionResolver को भी मानचित्रणजैकसन HttpMessageConverter की आवश्यकता है

 <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver"> <property name="messageConverters"> <list> <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> <property name="objectMapper" ref="jacksonObjectMapper" /> </bean> </list> </property> </bean> <bean id="jacksonObjectMapper" class="iacm.cemetery.framework.web.servlet.rest.JacksonObjectMapper" /> 

मुझे इसी तरह का सामना करना पड़ा, यह समस्या तब होती है जब आपका नियंत्रक विधि वापसी प्रकार और अपवादहैंडलर वापसी प्रकार समान नहीं होते हैं सुनिश्चित करें कि आपके पास बिल्कुल समान प्रकार के रिटर्न हैं

नियंत्रक विधि:

 @RequestMapping(value = "/{id}", produces = "application/json", method = RequestMethod.POST) public ResponseEntity<?> getUserById(@PathVariable String id) throws NotFoundException { String response = userService.getUser(id); return new ResponseEntity(response, HttpStatus.OK); } 

सलाह विधि:

 @ExceptionHandler(NotFoundException.class) public ResponseEntity<?> notFoundException(HttpServletRequest request, NotFoundException e) { ExceptionResponse response = new ExceptionResponse(); response.setSuccess(false); response.setMessage(e.getMessage()); return new ResponseEntity(response, HttpStatus.NOT_FOUND); } 

जैसा कि आप देख सकते हैं कि दोनों वर्गों में वापसी प्रकार समान हैं ResponseEntity<?>