2012-11-08 10 views
5

पर आधारित JSON या HTML प्रतिक्रिया की सेवा के लिए @ExceptionHandler का उपयोग करना मेरे नियंत्रक के पास उनके @RequestMapping (उत्पादन = "", उपभोग = "") एनोटेशन के आधार पर JSON या HTML उत्पन्न करने के तरीके हैं। हालांकि जब एक सामान्य तरीके से अपवादों को संभालने की बात आती है, तो मुझे समस्याओं का सामना करना पड़ रहा है।@RequestMapping

@RequestMapping(method = POST) 
public String add(@Valid MyForm form, BindingResult result, Model model) { 
    if (result.hasErrors()) { 
     return "edit"; 
    } 

    throw new RuntimeException("Error adding"); 

    return "edit"; 
} 

@RequestMapping(method = POST, produces = "application/json", consumes = "application/json") 
@ResponseBody 
public Map<String, Object> addJSON(@RequestBody @Valid MyForm form, Model model) { 
    throw new RuntimeException("Error adding"); 
} 

मैं उपरोक्त दो तरीकों के लिए @ExceptionHandler कैसे लिखूं? गैर-JSON के लिए एक को Model में एक विशेषता जोड़नी चाहिए।

model.addAttribute("error", exception.getMessage()); 

JSON उत्तर प्रकार के साथ एक, एक Map के रूप में त्रुटि वापस चाहिए बाद में JSON में श्रृंखलाबद्ध किया जाना है।

मैंने नीचे की कोशिश की लेकिन वसंत को दो अलग-अलग @ExceptionHandler एनोटेटेड विधियों को एक ही अपवाद प्रकार के साथ घोषित नहीं किया गया है।

@ExceptionHandler(RuntimeException.class) 
@ResponseStatus(value = HttpStatus.BAD_REQUEST) 
@RequestMapping(produces = "application/json") 
@ResponseBody 
public Map<String, Object> handleExceptionAsJSON(RuntimeException exception) { 
    Map<String, Object> map = new HashMap<>(); 
    map.put("error", exception.getMessage()); 

    return map; 
} 

@ExceptionHandler(RuntimeException.class) 
public Map<String, Object> handleException(RuntimeException exception) { 
    Map<String, Object> map = new HashMap<>(); 
    map.put("error", exception.getMessage()); 

    return map; 
} 

उत्तर

0
अपने ExceptionHandler है RuntimeException तर्क के

दोनों। इसलिए, आपके मामले में केवल 1 exceptionhandler सम्मानित है।

मुझे यकीन नहीं है कि आप क्या कर रहे हैं। लेकिन मुझे लगता है कि अपना खुद का exceptionresolver लिखना आपकी समस्या का समाधान करेगा। मैंने पहले ही यह किया है। मैंने अपना खुद का exceptionresolver बनाया जो केवल अजाक्स अनुरोधों के लिए समर्पित है और फिर इसे मौजूदा ExceptionHandlerExceptionResolver के साथ जंजीर कर दिया गया है।

+0

"अपवाद हैडलर को फेंकने योग्य तर्क के खिलाफ मैप किया गया है। इसलिए, आपके मामले में केवल 1 अपवादक सम्मानित है।" - वह सत्य नहीं है! – adarshr

+0

मैंने ऊपर अपनी पहली पंक्ति संशोधित की। यदि आप मुझ पर विश्वास नहीं करते हैं, तो कृपया 'ExceptionHandlerMethodResolver' के ** पंक्ति 71 ** (detectExceptionMappings विधि) की जांच करें। वसंत 3.2.x रास्ते से मेरा संदर्भ है। – ramirezag

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