我正在尝试使用 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中这种类型的实际实例。
您可以在此处查看脚本:
您可以获得Web服务定义的链接。 我该怎么办?如何从ColdFusion将简单的Array对象传递给WSLD?
答案 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缺失。所以问题是一样的 - 服务期望消耗的对象数组的格式是不正确的。