У меня есть сторонний веб-сервис, для которого я создаю клиента с помощью wsimport. Каждый вызов веб-службы завершается успешно, но у объекта ответа, который я получаю, все его поля установлены в нуль. Наблюдая за сетью, я вижу, что в сети все элементы XML в ответном сообщении содержат значения, поэтому объект должен иметь ненулевые данные. Кроме того, клиент для той же службы, созданной со старой осью 1 и вызванной с теми же данными, возвращает непустой ответ. Есть идеи, что происходит? (На случай, если будет какая-то разница, я использую реализацию JAXB от MOXy).
Обновление : я смог сузить его. Wsdl определяет объект в своем собственном пространстве имен, скажем, http://www.acme.com/ws
. Ответ, который я получаю от сервиса:
<?xml version="1.0" encoding="UTF-8"?>
... SOAP envelope ...
<ns1:opINFOWLResponse xmlns:ns1="http://www.acme.com/ws"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ns1:responseINFOWL xsi:type="ns1:responseINFOWL">
<result>6003</result>
<ndserr/>
<transid>61437594</transid>
<descriptionerr>BLAH.</descriptionerr>
</ns1:responseINFOWL>
</ns1:opINFOWLResponse>
... SOAP closing tags ...
и unmarshalled к ненулевому OpINFOWLResponse
, который оборачивается вокруг ненулевого responseINFOWL
объекта со всеми полями, установленными в нуль. Просто для забавы я попытался написать пару строк, чтобы разобрать вышеприведенный фрагмент (после удаления служебной нагрузки SOAP)
JAXBContext ctx = JAXBContext.newInstance(OpINFOWLResponse.class);
Unmarshaller u = ctx.createUnmarshaller();
OpINFOWLResponse o = (OpINFOWLResponse) u.unmarshal(new StringReader(theSnippetAbove));
ResponseINFOWL w = o.getResponseINFOWL();
и я получаю тот же результат. Если я изменю XML выше на
<?xml version="1.0" encoding="UTF-8"?>
<ns1:opINFOWLResponse xmlns:ns1="http://www.acme.com/ws"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ns1:responseINFOWL xsi:type="ns1:responseINFOWL">
<ns1:result>6003</ns1:result>
<ns1:ndserr/>
<ns1:transid>61437594</ns1:transid>
<ns1:descriptionerr>BLAH.</ns1:descriptionerr>
</ns1:responseINFOWL>
</ns1:opINFOWLResponse>
Все отлично работает. Облом.
Обновление (снова) : одинаковое поведение как с jaxb-RI, так и с Moxy. До сих пор понятия не имею, что не так.
Обновление (9 сентября) : Представленное ниже предложение о неверной квалификации пространства имен интересно, но я предположил, что wsimport все сделает правильно. Во всяком случае, это мой package-info.java
@XmlSchema(
namespace = "http://www.acme.com/ws",
elementFormDefault = XmlNsForm.QUALIFIED)
package it.sky.guidaTv.service.remote;
import javax.xml.bind.annotation.XmlSchema;
import javax.xml.bind.annotation.XmlNsForm;
и это соответствующая часть ResponseINFOWL
класса
<code>/*
* <p>Java class for responseINFOWL complex type.
*
* <p>The following schema fragment specifies the expected content contained within this class.
*
* <pre>
* <complexType name="responseINFOWL">
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="result" type="{http://www.w3.org/2001/XMLSchema}string"/>
* <element name="descriptionerr" type="{http://www.w3.org/2001/XMLSchema}string"/>
* <element name="transid" type="{http://www.w3.org/2001/XMLSchema}string"/>
* <element name="ndserr" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* <element name="wallet" type="{http://www.acme.com/ws}t_wallet" minOccurs="0"/>
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
*
*
*
* /
@XmlAccessorType (XmlAccessType.FIELD)
@XmlType (name = "responseINFOWL", propOrder = {
"result", "descriptionerr", "transid", "ndserr", "wallet"})
открытый класс ResponseINFOWL {
@XmlElement (обязательно = true)
результат защищенной строки;
@XmlElement (обязательно = true)
защищенный String descriptionerr;
@XmlElement (обязательно = true)
защищенная строка;
защищенная строка ndserr;
защищенный кошелек TWallet;
// геттеры, сеттеры и все.
}
Я попытался немного поиграть с пространствами имен в package-info
, но все еще не радует.