java.net.HttpRetryException:由于服务器身份验证,在流式处理模式下无法重试
我们的应用程序中有两个部分:
服务器 - 提供REST服务
客户端 - 通过Spring restTemplate使用它们
除了HTTP状态之外,我们的服务器还返回一个带有JSON的HTTP正文,详细说明错误。因此,我已将自定义错误处理程序添加到 restTemplate 中,以将一些编码为非错误的错误处理程序 - 它有助于很好地解析 HTTP 正文。
但是,在HTTP / 1.1 401 Unauthorized的情况下,通过解析HTTP正文,我得到了一个异常。所有其他错误代码处理正常(400、402 等)。我们使用的是普通服务器逻辑,在发生错误时发送HTTP响应,对于不同类型的错误没有特殊规则:
writeErrorToResponse(int status, String errMsg, HttpServletResponse resp) throws IOException {
response.setStatus(status);
response.setContentType(MediaType.APPLICATION_JSON_VALUE);
String message = String.format("{\"error\":\"%s\"}", StringUtils.escapeJson(errMsg));
resp.getWriter().println(message);
}
但在客户端上,只有 HTTP/1.1 401 会引发异常 -"java.net.HttpRetryException: cannot retry due to server authentication, in streaming mode"
我做了一些调试,看到问题的原因是SimpleClientHttpResponse中的代码:
HttpURLConnection.getInputStream()
使用 Fiddler 进行跟踪具有以下后续响应:消息在客户端上解析正确:
HTTP/1.1 402 Payment Required
X-Powered-By: Servlet/3.0
Content-Type: application/json
Content-Language: en-GB
Content-Length: 55
Connection: Close
Date: Sat, 25 May 2013 10:10:44 GMT
Server: WebSphere Application Server/8.0
{"error":"I cant find that user. Please try again."}
以及导致异常的消息:
HTTP/1.1 401 Unauthorized
X-Powered-By: Servlet/3.0
Content-Type: application/json
Content-Language: en-GB
Content-Length: 55
Date: Sat, 25 May 2013 11:00:21 GMT
Server: WebSphere Application Server/8.0
{"error":"I cant find that user. Please try again."}
在这种情况下,java.net.HttpRetryException的原因可能是什么?
另外:前段时间这个机制工作正常。但是由于我们已经在应用程序中更改了很多代码。