java - Spring MVC, Migrate @ExceptionHandler to HandlerExceptionResolver for a RESTful service -


background

i have error message class:

@xmlrootelement public class errormessage {     private string message;      public errormessage() {     }      public errormessage(string message) {         this.message = message;     }      public string geterror() {         return message;     }      public void seterror(string message) {         this.message = message;     } } 


this class has been assigned return value @exceptionhandler in spring mvc rest controller:

@exceptionhandler @responsestatus(httpstatus.not_found) @responsebody errormessage handleexception(runtimeexception e) {     return new errormessage("something went wrong"); } 

whenever client triggers runtimeexception after issuing request application/json accept header, receives response correct status code , matching json body:

{"error":"something went wrong"} 

alternatively, xml body received if accept header application/xml:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> <errormessage><error>something went wrong</error></errormessage> 


problem

now, generify solution implementing handlerexceptionresolver instead don't have copy / paste @exceptionhandler every controller (or create common "parent controller" other controllers can extend).

however, abstracthandlerexceptionresolver.doresolveexception() method returns modelandview , not propriety errormessage, tried following:

public class runtimeexceptionhandlerexceptionresolver extends abstracthandlerexceptionresolver {      @override     protected modelandview doresolveexception(httpservletrequest request, httpservletresponse response, object handler, exception ex) {         if (ex instanceof runtimeexception) {             response.setstatus(httpservletresponse.sc_not_found);             modelandview mav = new modelandview();             mav.addobject("error", "something went wrong");             return mav;         }         return null;     } } 

when debugging, can see mav.addobject() method called. response on client side has expected status code, content type text/html html in body, rather json or xlm content specified accept header in original request.

(side note, actual exception, response code , text message in example above not important, serve simple example.)

spring version: 3.1.1.release

to @exceptionhandlers use content negotiation, annotationmethodhandlerexceptionresolver has setmessageconverters() method must provided message converters, e.g.:

<bean class="org.springframework.web.servlet.mvc.annotation.annotationmethodhandlerexceptionresolver">     <property name="messageconverters">         <list>             <ref bean="xmlconverter"/>             <ref bean="jsonconverter"/>         </list>     </property> </bean> 

but since you're using custom method, you'll have implement functionality yourself. simplest way ctrl-c ctrl-v annotationmethodhandlerexceptionresolver source, handleresponsebody() method.


Comments

Popular posts from this blog

java - Play! framework 2.0: How to display multiple image? -

gmail - Is there any documentation for read-only access to the Google Contacts API? -

php - Controller/JToolBar not working in Joomla 2.5 -