将CFML参数转换为Java类以进行Web服务调用时出错

时间:2016-03-15 06:15:51

标签: java web-services coldfusion wsdl coldfusion-9

我正在尝试使用 cfinvoke 标记从ColdFusion中使用WSDL,并且我在传递参数时遇到问题。如果它是一个简单的STRING或NUMERIC参数,那么效果很好。问题是当我需要传递这个论点时:

<part name="options" type="soap-enc:Array"/>

好吧,我尝试了不同的方法:传递ColdFusion ARRAY,STRUCT,简单的字符串等。没有任何作用。在某些情况下,我收到了来自Web服务的响应,告知参数丢失,当我传递结构时,我收到此错误:

  

将CFML参数转换为Web服务的Java类时出错   调用。无法创建Web服务参数类   [Ljava.lang.Object ;.错误:java.lang.InstantiationException:   [Ljava.lang.Object ;.通常这是因为Web服务定义了一个   abstract complexType作为操作的输入。你必须创建一个   Java中这种类型的实际实例。

您可以在此处查看脚本:

cf wsdl web service test

您可以获得Web服务定义的链接。 我该怎么办?如何从ColdFusion将简单的Array对象传递给WSLD?

1 个答案:

答案 0 :(得分:3)

如您所见,复杂SOAP对象周围缺乏透明度是目前JSON作为数据格式首选的一个重要原因。我编写了Java组件来处理这类事情。您需要知道options变量的特定格式(第二个参数),它是一个Objects数组,尽管它没有提供任何细节。我没有一个完全可行的解决方案,但是这段代码应该可以帮到你。

<cfscript>
    ws = createObject("webservice", "https://api.iritravel.ro/?wsdl");
    res = ws.getCountries(token = "137e8f1a094-1031");
    country = createObject( "java", "java.util.HashMap" ).init();
    country.put( 'CountryId', 2 );
    res2 = ws.getTowns( token = "137e8f1a094-1031", options=[ country ] );
    writedump( res2 );
    writedump( country );
</cfscript>

如果我开始工作,我会发布更新,但您可以使用我在这里的内容完成更新。我创建了一个HashMap(基本Java对象),并添加了一个值为2的键“CountryId”。请参阅我将options参数格式化为数组的方式,并将国家HashMap对象作为数组的第一个元素传递给它。这段代码可以工作,所以你只需要知道服务所期望的Object的特定格式。

更新

我已经包含了一个SOAPUI生成的getTowns()请求,它表明无论是使用webservices调用还是cfhttp,问题都是一样的。在这种情况下,我在请求中添加了一个CountryId参数,我得到的是与前一次调用相同的响应 - param CountryId缺失。所以问题是一样的 - 服务期望消耗的对象数组的格式是不正确的。

http://pastebin.com/ZXBS2e2r