Groovy http builder针对二进制内容的NoSuchMethodError
我正在使用http builder 0.7.1获取二进制内容。这在Groovy 2/Spock 1上运行良好,但在Groovy 3/Spock 2上会导致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;
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条目。谢谢!这很有帮助。代码并不完全正确,但指向了正确的方向。我已使用适用于我的代码更新了代码。已打开拉取请求以解决此问题: