Servlets HttpServletResponse#sendError如何更改ContentType

Servlets HttpServletResponse#sendError如何更改ContentType,servlets,content-type,http-error,Servlets,Content Type,Http Error,我正在创建一个简单的Servlet来回答表单提交。此servlet接收POST请求,并应响应应用程序/JSON数据。这很有效。 现在我想将错误管理添加到我的servlet中:如果servlet接收到错误的请求参数,我希望它用一个简单的{“error”:“error MESSAGE”}JSON响应回答客户机400-“错误请求”响应 我正在使用HttpServletResponse#senderro(int,String)来正确发送错误,但是响应的ContentType总是设置为text/html,

我正在创建一个简单的Servlet来回答表单提交。此servlet接收POST请求,并应响应应用程序/JSON数据。这很有效。 现在我想将错误管理添加到我的servlet中:如果servlet接收到错误的请求参数,我希望它用一个简单的
{“error”:“error MESSAGE”}
JSON响应回答客户机400-“错误请求”响应

我正在使用
HttpServletResponse#senderro(int,String)
来正确发送错误,但是响应的
ContentType
总是设置为
text/html
,即使我以前使用过
HttpServletResponse#setContentType(“application/json”)

这是使用servlet发送错误的好方法吗?如何将响应的
ContentType
强制为
application/json

我的测试Servlet的doPost()方法的示例代码:

public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("application/json;charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.print("{\"error\":1}");
        response.sendError(HttpServletResponse.SC_BAD_REQUEST);
}
这是有效的:

使用指定的状态和状态向客户端发送错误响应 清除缓冲区。服务器默认为创建对的响应 看起来像HTML格式的服务器错误页,其中包含指定的 消息,将内容类型设置为“text/html”

另一方面,没有此限制/功能

使用指定的状态代码向客户端发送错误响应 以及清除缓冲区


这意味着:设置内容类型,写入缓冲区,调用
sendError(400)

而不是调用response.sendError(int),使用response.setStatus(int)。

我最近想在JAX-RS应用程序内部发送错误消息时遇到了这个问题
sendError
将根据规范始终返回text/html。给定
HttpServletResponse响应,我必须执行以下操作:

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!
与发送错误一样,
flushBuffer
对于将响应标记为已提交非常重要。起初,我尝试在输出流上调用close,但结果是我的过滤器将运行,然后JAX-RS资源将继续正常运行,然后我将得到错误消息和正常响应,并将其与200个状态代码连接在一起


resetBuffer
是否存在,以防其他任何内容在此筛选器之前设置了标题或写入了某些内容。

感谢您的快速回复!我试过你解释的。不确定是否做得好,因为它没有按预期工作:(不确定“写入缓冲区”部分。我用用于测试目的的代码示例编辑了第一篇文章。这对我不起作用。sendError将忽略我以前编写的任何内容。这也不会触发JBoss/WildFlyWonder中的错误页面确认,具体行为在多大程度上取决于特定的JavaEE平台。
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!