Talend:tRESTClient returns 删除后响应为空

Talend: tRESTClient returns empty response after delete

我是 Talend 的新手。我使用 5.6.1 Talend Studio。我正在使用 tRESTClient 向服务发送 DELETE 请求。我希望得到 xml 带有错误代码的响应。

在客户端日志中我可以看到我需要的 xml,但是响应行中的正文和字符串值都是空的。 tRESTClient 日志:

ID: 1
Response-Code: 200
Encoding: ISO-8859-1
Content-Type: application/xml
Headers: 
{Content-Length=[492], 
content-type=[application/xml], 
Date=[Mon, 18 May 2015 15:02:24 GMT], 
Server=[Apache-Coyote/1.1]}
Payload: 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:Response xmlns:ns1="..." xmlns:ns2="...">
    <ns1:IsSuccess>false</ns1:IsSuccess>
    <ns1:ErrorList>
        <ns2:Error>
            <ns2:Code>80</ns2:Code>
            <ns2:Description>Can't find service</ns2:Description>
            <ns2:Severity>error</ns2:Severity>
        </ns2:Error>
    </ns1:ErrorList>
</ns1:Response>

我尝试将负载和其他字段添加到客户端输出行,但没有结果。 客户端之后的 tLogRow:

|200|||

XML 需要进一步处理,纯状态代码是不够的。 POST 和 GET 请求工作正常,我在字符串或正文字段中获取响应数据。当使用带有 SOAP UI 等工具的 DELETE 服务时,一切都很好,我收到预期的 XML.

谁能告诉我为什么我会遇到这个问题以及如何解决它?

更新:

使用调试器我发现用于为输出行生成正文或字符串的 responseDoc_tRESTClient_1 始终为空。它在开始时用 null 初始化,并且永远不会改变。

看起来问题出在为服务调用生成的代码上。例如,如果我们发送 GET 请求,它会生成以下代码:

responseDoc_tRESTClient_1 = webClient_tRESTClient_1.get(responseClass_tRESTClient_1);

如果我们发送 DELETE 请求,它会生成以下代码:

webClient_tRESTClient_1.invoke("DELETE", requestBody_tRESTClient_1);

我看到 webClient 也有方法 .delete(),returns 响应作为 .get(...) 方法。有没有办法强制 Talend 使用 .delete() 方法而不是 .invoke()

我设法找到了这个问题的解决方案。

我用创建 cxf 客户端、调用服务并将响应添加到输出行的 tJavaRow 替换了 tRESTClient 组件。

WebClient client = WebClient.create(context.serviceFullUrl);
client.path("rest/path/"+in1.serviceId);
client.accept("application/xml");
Response response = client.delete();        
String r = response.readEntity(String.class);

output_row.statusCode = response.getStatus();
output_row.string = r;
output_row.body = null;

进口:

import javax.ws.rs.core.Response;
import org.apache.cxf.jaxrs.client.WebClient;

Talend Studio 可能会抛出 NoClassDefFoundError,但在运行时作业运行良好。

但我很确定应该有更好的解决方案。