[SPR-9283] Improved support for REST API error reporting Created: 29/Mar/12 Updated: 27/Nov/12 Resolved: 21/Aug/12
|Fix Version/s:||3.2 M2|
|Reporter:||Keith Donald||Assignee:||Rossen Stoyanchev|
|Remaining Estimate:||Not Specified|
|Time Spent:||Not Specified|
|Original Estimate:||Not Specified|
|Days since last comment:||5 years, 43 weeks, 4 days ago|
|Last commented by a User:||true|
When implementing a REST API, Spring MVC provides full control over what ResponseEntity is returned to a client, which includes full support for setting custom HTTP status codes, response headers, and the response body. This is great and very flexible; however, the error reporting support in Spring MVC for common cases could be made more convenient.
Specifically, there is no way to auto-map an application business exception to a error response that contains all of the following bits of information: 1. an appropriate HTTP status code, and 2. a custom ErrorBody consisting of an application-specific error message and code. Yes, I know you can annotate an Exception with @ResponseStatus to specify which HTTP status code should be returned when that Exception is thrown. However, there is no ability to specify error data that should be returned in the body (message, code, etc) along with that. You can set a "reason" String, but unfortunately that is just passed off to HttpServletResponse#sendError(int, String) which isn't easily customized & by default generates a HTML response (not what you want with machine-to-machine communication--you typically want a JSON error body).
Facebook is an example of a REST API that returns a error body along with appropriate HTTP status codes in their API error responses e.g.:
It would be useful if Spring MVC had a documented way of throwing a business exception that automatically resulted in a error response with an appropriate HTTP status code plus a application/json response body containing a application-specific error message and error code.
Related, if a @Valid object validation failure could also be auto-mapped to an appropriate error structure (e.g. a 400 error status plus a body containing the field(s) in error along with messages and codes for each field error), that would be quite useful as well.
|Comment by Rossen Stoyanchev [ 21/Aug/12 ]|
There is also a new ResponseEntityExceptionHandler base class with an @ExceptionHandler method that handles standard Spring MVC exceptions. It's functionally equivalent to the DefaultHandlerExceptionResolver but returns a ResponseEntity (instead of a ModelAndView) and relies on message converters.
|Comment by Pavel Orehov [ 11/Nov/12 ]|
I'm trying to use that new feature but things does not work as expected.
|Comment by Pavel Orehov [ 27/Nov/12 ]|
It would be very helpful if I could also bind MethodHandler in exception handler method with @ExceptionHandler annotation.
Like the following code: