Groovy http builder针对二进制内容的NoSuchMethodError

Groovy http builder针对二进制内容的NoSuchMethodError,groovy,Groovy,我正在使用http builder 0.7.1获取二进制内容。这在Groovy 2/Spock 1上运行良好,但在Groovy 3/Spock 2上会导致NoSuchMethodError: java.lang.NoSuchMethodError: org.codehaus.groovy.runtime.DefaultGroovyMethods.leftShift(Ljava/io/OutputStream;Ljava/io/InputStream;)Ljava/io/OutputStream;

我正在使用http builder 0.7.1获取二进制内容。这在Groovy 2/Spock 1上运行良好,但在Groovy 3/Spock 2上会导致
NoSuchMethodError

java.lang.NoSuchMethodError: org.codehaus.groovy.runtime.DefaultGroovyMethods.leftShift(Ljava/io/OutputStream;Ljava/io/InputStream;)Ljava/io/OutputStream;
    at groovyx.net.http.HTTPBuilder.defaultSuccessHandler(HTTPBuilder.java:620)
    at groovyx.net.http.RESTClient.defaultSuccessHandler(RESTClient.java:246)
...
rest客户端是以一种非常基本的方式初始化的:

restClient = new RESTClient(baseUrl)
restClient.handler.failure = restClient.handler.success
获取二进制内容的过程也很简单:

def response = restClient.get(path: theUrl)
返回的内容包含以下标题:

Content-Disposition: form-data; name="file"; filename="MyPhoto.jpg"
Content-Type: image/jpeg
Content-Transfer-Encoding: binary
这段代码在Groovy 2.5.14和Spock 1.3-Groovy-2.5中运行良好,但在Groovy 3.0.8和Spock 2.0-Groovy-3.0中失败


有什么想法吗?

正如您所提到的,我相信这是升级到Groovy 3的结果。快速查看一下,DefaultGroovyMethods
leftShift(OutputStream self,InputStream in)
以前被标记为已弃用,看起来好像在3.0的更改过程中被删除了(尽管我找不到确切的位置)。但是,您仍然可以在IOGroovyMethods中找到相同的方法

您的问题是RESTClient/HttpBuilder库尚未更新以反映Groovy的更改。但是,您可以轻松地扩展RESTClient并为
defaultSuccessHandler
方法提供覆盖,将处理程序指向正确的位置:

@Override
HttpResponseDecorator defaultSuccessHandler(HttpResponseDecorator resp, Object parsedData)
        throws ResponseParseException
{
    try
    {
        //If response is streaming, buffer it in a byte array:
        if (parsedData instanceof InputStream)
        {
            ByteArrayOutputStream buffer = new ByteArrayOutputStream();
            // we've updated the below line
            IOGroovyMethods.leftShift(buffer, (InputStream) parsedData);
            resp.setData(new ByteArrayInputStream(buffer.toByteArray()))
            return resp;
        }
        if (parsedData instanceof Reader)
        {
            StringWriter buffer = new StringWriter();
            // we've updated the below line
            IOGroovyMethods.leftShift(buffer, (Reader) parsedData);
            resp.setData(new StringReader(buffer.toString()))
            return resp;
        }
        return super.defaultSuccessHandler(resp, parsedData)
    }
    catch (IOException ex)
    {
        throw new ResponseParseException(resp, ex);
    }
}

请注意,Groovy 3还更改了某些XML UTIL的位置,这在将来可能会成为RESTClient的一个问题。如果需要,可以在自定义RESTClient中覆盖ParserRegistry中现有的XML条目。

谢谢!这很有帮助。代码并不完全正确,但指向了正确的方向。我已使用适用于我的代码更新了代码。已打开拉取请求以解决此问题: