gpt4 book ai didi

java - 将 CFML 参数转换为用于 Web 服务调用的 Java 类时出错

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:39:22 24 4
gpt4 key购买 nike

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

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

好吧,我尝试了不同的方法:传递 ColdFusion ARRAY、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.

您可以在此处查看正在运行的脚本:

cf wsdl web service test

那里有指向 Web 服务定义的链接。我应该怎么办?如何将简单的 Array 对象从 ColdFusion 传递到 WSLD?

最佳答案

像您在这里看到的那样,复杂的 SOAP 对象缺乏透明度,这是如今 JSON 成为首选数据格式的一个重要原因。我已经编写了 Java 组件来处理这种事情。您需要知道选项变量(第二个参数)的具体格式,它是一个对象数组,但它没有给出详细信息。我没有适合您的完全可行的解决方案,但这段代码应该可以帮助您完成大部分工作。

<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”。请参阅我将选项参数格式化为数组并将国家/地区 HashMap 对象作为数组的第一个元素传递给它的方式。这段代码有效,所以您只需要知道服务期望的对象的具体格式。

更新

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

http://pastebin.com/ZXBS2e2r

关于java - 将 CFML 参数转换为用于 Web 服务调用的 Java 类时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36003929/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com