Java Spring RestTemplate BufferingClientHttpRequestWrapper bug?

Java Spring RestTemplate BufferingClientHttpRequestWrapper bug?,java,resttemplate,Java,Resttemplate,我正在阅读BufferingClientHttpRequestWrapper类的源代码: final class BufferingClientHttpRequestWrapper extends AbstractBufferingClientHttpRequest { private final ClientHttpRequest request; BufferingClientHttpRequestWrapper(ClientHttpRequest request) { Ass

我正在阅读BufferingClientHttpRequestWrapper类的源代码:

final class BufferingClientHttpRequestWrapper extends AbstractBufferingClientHttpRequest {

private final ClientHttpRequest request;


BufferingClientHttpRequestWrapper(ClientHttpRequest request) {
    Assert.notNull(request, "'request' must not be null");
    this.request = request;
}


public HttpMethod getMethod() {
    return this.request.getMethod();
}

public URI getURI() {
    return this.request.getURI();
}

@Override
protected ClientHttpResponse executeInternal(HttpHeaders headers, byte[] bufferedOutput) throws IOException {
    OutputStream body = this.request.getBody();
    this.request.getHeaders().putAll(headers);
    FileCopyUtils.copy(bufferedOutput, body);
    ClientHttpResponse response = this.request.execute();
    return new BufferingClientHttpResponseWrapper(response);
}

}
在重写的方法executeInternal

OutputStream body = this.request.getBody();
this.request.getHeaders().putAll(headers);
FileCopyUtils.copy(bufferedOutput, body);
ClientHttpResponse response = this.request.execute();
我注意到this.request.getBody()位于this.request.getHeaders().putAll(headers)之前,这可能是一个错误,导致传入的头无法写入。例如,如果包装的请求是SimpleStreamingClientHttpRequest的实例,则SimpleStreamingClientHttpRequest的相关源代码如下所示:

@Override
protected OutputStream getBodyInternal(HttpHeaders headers) throws IOException {
    if (this.body == null) {
        int contentLength = (int) headers.getContentLength();
        if (contentLength >= 0 && !olderThanFroyo) {
            this.connection.setFixedLengthStreamingMode(contentLength);
        } else {
            this.connection.setChunkedStreamingMode(this.chunkSize);
        }
        writeHeaders(headers);
        this.connection.connect();
        this.body = this.connection.getOutputStream();
    }
    return new NonClosingOutputStream(this.body);
}

@Override
protected ClientHttpResponse executeInternal(HttpHeaders headers) throws IOException {
    try {
        if (this.body != null) {
            this.body.close();
        } else {
            writeHeaders(headers);
            this.connection.connect();
        }
    } catch (IOException ex) {
        // ignore
    }
    return new SimpleClientHttpResponse(this.connection);
}
从上面的代码片段中,我们可以看出,一旦调用getBody()(它调用getBodyInternal()),头被写入连接(HttpUrlConnection),调用execute()(它调用executeInternal())将而不是写入头。(costhis.body将不为空)。在本例中,让我们返回到BufferingClientHttpRequestWrapper的实现:

OutputStream body = this.request.getBody();
this.request.getHeaders().putAll(headers);
FileCopyUtils.copy(bufferedOutput, body);
ClientHttpResponse response = this.request.execute();
第一行将导致写入旧的头,第二行尝试放入新的头条目是徒劳的(因为第四行永远不会写入头,如上所述)

这是一个错误还是我错了?(无论如何,我会在不着急的时候通过练习来尝试……)