HttpServletResponse#sendError How to change ContentType

I recently had this issue when wanting to send error messages inside of a JAX-RS application. sendError would always return text/html, per the spec. I had to do the following, given a HttpServletResponse response:

response.resetBuffer();
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
response.setHeader("Content-Type", "application/json");
response.getOutputStream().print("{\"errorMessage\":\"You can't use this!\"}");
response.flushBuffer(); // marks response as committed -- if we don't do this the request will go through normally!

The flushBuffer is critical to mark the response as committed, as sendError does. At first I tried just calling close on the output stream, but what would happen is my filter would run then the JAX-RS resource would continue to run normally, then I'd get the error message AND the normal response concatenated together with 200 status code!

resetBuffer is there just in case anything else has set headers or written some content before this filter.


That works as specified:

Sends an error response to the client using the specified status and clears the buffer. The server defaults to creating the response to look like an HTML-formatted server error page containing the specified message, setting the content type to "text/html".

HttpServletResponse.sendError(int)

on the other hand does not have this restriction/feature.

Sends an error response to the client using the specified status code and clearing the buffer.

This means: set the content type, write to the buffer, call sendError(400).