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.