我正在尝试使用cfinvoke标记从ColdFusion使用WSDL,并且在传递参数时遇到问题.如果它是简单的STRING或NUMERIC参数,则效果很好.问题是当我需要传递此参数时:
<part name="options" type="soap-enc:Array"/>
好吧,我尝试了不同的方法:传递ColdFusion数组,STRUCT,简单的字符串等.在某些情况下,我从Web服务获得响应,告知该参数丢失,并且在传递结构时,出现此错误:
Error converting CFML arguments to Java classes for web service
invocation. Unable to create web service argument class
[Ljava.lang.Object;. Error: java.lang.InstantiationException:
[Ljava.lang.Object;. Often this is because the web service defines an
abstract complexType as an input to an operation. You must create an
actual instance of this type in Java.
您可以在此处查看正在运行的脚本:
在那里,您具有指向Web服务定义的链接.
我该怎么办?如何从ColdFusion将简单的Array对象传递给WSLD?
最佳答案
像您在此处看到的那样,复杂的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参数格式化为数组并将country HashMap对象作为数组的第一个元素传递给我的方式.这段代码起作用了,所以您只需要知道服务期望的对象的特定格式即可.
更新资料
我已经包含了一个SOAPUI生成的getTowns()请求,该请求表明无论使用webservices调用还是cfhttp,问题都是相同的.在这种情况下,我向请求中添加了CountryId参数,返回的结果与上一次调用得到的响应相同-参数CountryId丢失.因此问题是相同的-服务期望使用的对象数组的格式不正确.