我现在正在创建一个简单的Servlet来回答表单子目录。此servlet接收POST请求,并应响应Application / JSON数据。这很好用。
我现在想要向我的servlet添加错误管理:如果servlet收到错误的请求参数,我希望它通过一个简单的{"error":"ERROR MESSAGE"}
JSON响应来回答客户端400 - “错误请求”响应。
我正在使用HttpServletResponse#sendError(int,String)
正确发送错误,但响应的ContentType
始终设置为text/html
,即使我之前使用过HttpServletResponse#setContentType("application/json")
。< / p>
这是使用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);
}
答案 0 :(得分:13)
我想在JAX-RS应用程序中发送错误消息时遇到此问题。根据规范,sendError总是返回text / html。鉴于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!
如sendError所做的那样,flushBuffer对于将响应标记为已提交至关重要。起初我尝试在输出流上调用close,但是会发生什么情况是我的过滤器会运行然后JAX-RS资源将继续正常运行,然后我会得到错误消息并且正常响应与200状态连接在一起代码!
resetBuffer就是为了防止其他任何设置标题或在此过滤器之前写入一些内容。
答案 1 :(得分:2)
有效as specified:
使用指定的状态向客户端发送错误响应 清除缓冲区。服务器默认为创建响应 看起来像包含指定的HTML格式的服务器错误页面 消息,将内容类型设置为“text / html”。
HttpServletResponse.sendError(int)
另一方面,没有此限制/功能。
使用指定的状态代码向客户端发送错误响应 并清除缓冲区。
这意味着:设置内容类型,写入缓冲区,调用sendError(400)
。
答案 2 :(得分:0)
使用response.setStatus(int)而不是调用response.sendError(int)。