неспособность десериализовать сложные типы на оси apache - проблема anytype - PullRequest
3 голосов
/ 04 августа 2011

Я вынужден использовать то, что выглядит как очень старый wsdl, для генерации клиентов веб-служб. Настолько старый, что wsimport от jdk отказывается его анализировать. Однако Axis 1.4 успешно генерирует клиент веб-сервиса, который по большей части работает. Есть одна досадная проблема, она не может обрабатывать последовательные сложные типы, описанные с помощью «anyType»

Вот оригинальная трассировка стека:

java.lang.RuntimeException: org.xml.sax.SAXException: No deserializer for {http://www.w3.org/2001/XMLSchema}anyType
Caused by: org.xml.sax.SAXException: No deserializer for {http://www.w3.org/2001/XMLSchema}anyType
    at org.apache.axis.AxisFault.makeFault(AxisFault.java:101)
    at org.apache.axis.client.Call.invoke(Call.java:2470)
    at org.apache.axis.client.Call.invoke(Call.java:2366)
    at org.apache.axis.client.Call.invoke(Call.java:1812)

Я думал, что смогу решить эту проблему, зарегистрировав TypeMapping, который пытается отобразить элемент (см. Ниже xml) в связанный класс, но это не работает:

код добавлен ...

_call.registerTypeMapping(VoipAccountSubscriberRead.class, new QName("http://www.w3.org/2001/XMLSchema", "anyType"), null, new BeanDeserializerFactory(VoipAccountSubscriberRead.class, new QName("http://www.w3.org/2001/XMLSchema", "anyType")));

... полученная трассировка стека:

J

Caused by: java.lang.IllegalArgumentException: argument type mismatch
    at org.apache.axis.encoding.ser.BeanPropertyTarget.set(BeanPropertyTarget.java:157)
    at org.apache.axis.encoding.DeserializerImpl.valueComplete(DeserializerImpl.java:249)
    at org.apache.axis.encoding.ser.ArrayDeserializer.valueComplete(ArrayDeserializer.java:583)
    at org.apache.axis.encoding.DeserializerImpl.endElement(DeserializerImpl.java:509)

Это связано с тем, что xml имеет более одного вложенного сложного типа, описанного anytype [1] и anytype [0], или я просто не в курсе? Я новичок в SOAP, с базовым пониманием xml и неадекватным пониманием xsd, так что, вероятно, я не в порядке:)

Вот входящий xml:

<?xml version="1.0"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <get_voip_account_by_external_idResponse xmlns="urn:/SOAP/Provisioning">
      <data>
        <create_timestamp xsi:type="xsd:string">2011-08-04 13:55:58</create_timestamp>
        <status xsi:type="xsd:string">active</status>
        <billing_profile xsi:type="xsd:string">default</billing_profile>
        <terminate_timestamp xsi:nil="true" xsi:type="xsd:string"/>
        <activate_timestamp xsi:type="xsd:string">2011-08-04 13:55:58</activate_timestamp>
        <modify_timestamp xsi:type="xsd:string">2011-08-04 13:55:58</modify_timestamp>
        <external_id xsi:type="xsd:string">CID_472486001</external_id>
        <id xsi:type="xsd:int">121</id>
        <subscribers soapenc:arrayType="xsd:anyType[1]" xsi:type="soapenc:Array">
          <item>
            <admin xsi:type="xsd:boolean">false</admin>
            <alias_numbers soapenc:arrayType="xsd:anyType[0]" xsi:type="soapenc:Array"/>
            <webpassword xsi:nil="true" xsi:type="xsd:string"/>
            <status xsi:type="xsd:string">active</status>
            <ac xsi:nil="true" xsi:type="xsd:int"/>
            <webusername xsi:nil="true" xsi:type="xsd:string"/>
            <uuid xsi:type="xsd:string">5cad2cac-cc03-45bd-9ea9-189e22fdd406</uuid>
            <account_id xsi:nil="true" xsi:type="xsd:int"/>
            <username xsi:type="xsd:string">c734106b8e563edebc3098a991402566</username>
            <domain xsi:type="xsd:string">labzip-snc01.somedomain.com</domain>
            <password xsi:type="xsd:string">4daac6c07b33c76c2d5ff9bb710f4ab7</password>
            <external_id xsi:type="xsd:string">CID_472486001</external_id>
            <cc xsi:nil="true" xsi:type="xsd:int"/>
            <subscriber_id xsi:type="xsd:int">127</subscriber_id>
            <sn xsi:nil="true" xsi:type="xsd:string"/>
          </item>
        </subscribers>
      </data>
    </get_voip_account_by_external_idResponse>
  </soap:Body>
</soap:Envelope>

ЛЮБАЯ ПОМОЩЬ БОЛЬШОЙ ЦЕННОСТИ !!!! (даже если это не ответ сам по себе. Просто укажите мне правильное направление)

...