我正在创建一个简单的 Servlet 来响应表单提交。此 servlet 接收 POST 请求并应响应应用程序/JSON 数据。这运作良好。
我现在想向我的 servlet 添加错误管理:如果 servlet 收到错误的请求参数,我希望它用一个简单的 {"error":"ERROR MESSAGE"} 响应客户端 400 —“Bad Request”
JSON 响应。
我正在使用 HttpServletResponse#sendError(int,String)
正确发送错误,但响应的 ContentType
始终设置为 text/html
,即使我之前使用过 HttpServletResponse#setContentType("application/json")
。
这是使用 Servets 发送错误的好方法吗?如何强制 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);
}
最佳答案
我最近在想在 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
对于将响应标记为已提交至关重要,就像 sendError
一样。起初我尝试只在输出流上调用 close,但结果是我的过滤器会运行,然后 JAX-RS 资源会继续正常运行,然后我会收到错误消息,正常响应与 200 状态连接在一起代码!
resetBuffer
是为了防止其他任何东西在此过滤器之前设置 header 或写入一些内容。
关于servlets - HttpServletResponse#sendError 如何更改 ContentType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14459045/