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
Post a Comment