Класс-заглушка WSDL2Java, получающий ArrayList вместо одного объекта - PullRequest
1 голос
/ 25 августа 2011

Я очень плохо знаком с веб-сервисами, поэтому, пожалуйста, прости мое невежество.Я пытаюсь использовать веб-сервис, для которого мне был предоставлен wsdl.Есть несколько сложных типов, возвращаемых веб-сервисом.Вот пример одного из них:

<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 для тестирования веб-службы, и она работает, но она возвращает несколько объектов DLTankInventory (может быть, возвращает массив?).Похоже, что инструмент WSDL2Java должен возвращать только один объект DLTankInventory.Что я делаю неправильно?При необходимости я могу опубликовать больше кода wsdl или клиента.

Спасибо

- РЕДАКТИРОВАТЬ Я вошел в класс Stub и изменил функцию для приведения возвращаемого объекта в ArrayList объекта DLTankInventory.и, кажется, работает сейчас.Мой вопрос по-прежнему заключается в том, почему WSDL2Java хотел, чтобы он возвращал один объект.WSDL не так?Мне сказали, что это правильно.

Ответы [ 2 ]

0 голосов
/ 25 августа 2011

Похоже, вы используете какую-то платформу веб-сервисов, такую ​​как CXF, Axis или XFire. Если вы получаете ClassCastException при попытке использовать среду для десериализации сообщения, используя заглушки, которые были сгенерированы той же самой средой, то это ошибка в конкретной реализации библиотеки Wsdl2Java, которую вы используете.

Предполагая, что это реализация с открытым исходным кодом, такая как CXF или Axis, вы должны сообщить об этом на их форумах / досках объявлений или опубликовать простой тестовый пример, чтобы они могли попробовать.

0 голосов
/ 25 августа 2011

Переносятся только примитивные типы данных.Вы должны сериализовать и десериализовать (о котором я не знаю) объект или создать объект нужного вам класса, взяв поля, а затем создав из него объект.

...