Incomplete output stream问题解决

933 阅读1分钟
引发问题的原因
  • 系统要做国际化,SpringCloud需要将Accept-Language header param传递到feign服务。遍历RequestHeaders,将HeaderName以key-value形式添加到RequestTemplate中。
Enumeration<String> headerNames = request.getHeaderNames();
if (headerNames != null) {
    while (headerNames.hasMoreElements()) {
        String name = headerNames.nextElement();
        String value = request.getHeader(name);
        requestTemplate.header(name, value);
    }
 }

发布到测试环境。Get请求测试没问题,信心满满,so easy。。。

问题发生

执行post请求时,系统开始报错。

(报错信息片段)
Caused by: java.io.IOException: Incomplete output stream
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1523)
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492)
        at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
        at feign.Client$Default.convertResponse(Client.java:143)
        at feign.Client$Default.execute(Client.java:68)

下游feign服务,正常返回接口数据,上游报上述错误信息。

问题解决

在SpringCloud github issues中,有关于这个问题的解决办法,导致问题发生的原因就是header参数中传递了Content-Length导致的。需要在上游传递Header Param时,剔除这个HeaderName. github.com/spring-clou…

Enumeration<String> headerNames = request.getHeaderNames();
if (headerNames != null) {
    while (headerNames.hasMoreElements()) {
        String name = headerNames.nextElement();
        String value = request.getHeader(name);
        if ("content-length".equalsIgnoreCase(name)) {
            continue;
        }
        requestTemplate.header(name, value);
    }

完美解决。