我对网络服务很陌生,所以请原谅我的无知。我正在尝试使用我提供wsdl的Web服务。 Web服务返回了几种复杂类型。以下是一个例子:
<complexType name="DL-TankInventory">
<sequence>
<element name="DateTime" type="xsd:long" minOccurs="1" maxOccurs="1"/>
<element name="TankNumber" type="xsd:short" minOccurs="1" maxOccurs="1"/>
<element name="ProductCode" type="xsd:byte" minOccurs="1" maxOccurs="1"/>
<element name="StatusBits" type="xsd:short" minOccurs="1" maxOccurs="1"/>
<element name="ProductVolume" type="xsd:double" minOccurs="1" maxOccurs="1"/>
<element name="ProductTcVolume" type="xsd:double" minOccurs="1" maxOccurs="1"/>
<element name="Ullage" type="xsd:double" minOccurs="1" maxOccurs="1"/>
<element name="ProductHeight" type="xsd:double" minOccurs="1" maxOccurs="1"/>
<element name="WaterHeight" type="xsd:double" minOccurs="1" maxOccurs="1"/>
<element name="WaterVolume" type="xsd:double" minOccurs="1" maxOccurs="1"/>
<element name="AvgFuelTemperature" type="xsd:double" minOccurs="1" maxOccurs="1"/>
</sequence>
</complexType>
我使用WSDL2Java来创建客户端类,一切似乎都没问题。它创建了一个名为DLTankInventory的类(与没有破折号的complexType相同)。当我调用应返回此DLTankInventory对象的方法时,它会抛出一个ClassCastException,表示它无法将ArrayList强制转换为DLTankInventory。
我使用soapUI程序测试Web服务并且它可以工作,但是它返回多个DLTankInventory对象(可能返回一个数组?)。 WSDL2Java工具似乎认为它应该只返回一个DLTankInventory对象。我究竟做错了什么?如果需要,我可以发布更多的wsdl或客户端代码。
由于
- 编辑 我进入Stub类并修改了函数以将返回的Object转换为DLTankInventory对象的ArrayList,它现在似乎正在工作。我的问题仍然是为什么WSDL2Java想让它返回一个对象。 WSDL错了吗?我被告知这是正确的。
答案 0 :(得分:0)
仅传输原始数据类型。您必须序列化和反序列化(关于哪些不熟悉)对象,或者通过获取字段并稍后从中创建对象来创建所需类的对象。
答案 1 :(得分:0)
听起来您正在使用某种Web服务框架,如CXF,Axis或XFire。如果您在尝试使用框架反序列化消息时收到ClassCastException,使用由同一框架生成的存根,那么这就是您正在使用的特定Wsdl2Java库实现中的错误。
假设它是一个像CXF或Axis这样的开源实现,你应该在他们的论坛/留言板上报告这个,或者发布一个简单的测试用例供他们试用。