Параметры в запросе к веб-сервису POJO AXIS2 не передаются в POJO - PullRequest
2 голосов
/ 13 января 2011

У нас есть веб-сервис POJO, реализованный в AXIS2 v1.5.2, работающий в Tomcat 6 за веб-сервером Apache2.

В демонстрационных целях я сосредоточусь на сообщении validateUser и соответствующем методе. Все сообщения ведут себя одинаково.

Я видел это , а также пару других связанных вопросов, но они, похоже, не доходят до сути вопроса.

Когда запросы отправляются в службу, параметры передаются в POJA как пустые и пустые.

Первый WSDL:

<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ns1="http://org.apache.axis2/xsd" xmlns:ns="http://service.icomet.com" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:ax21="http://util.java/xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="http://service.icomet.com">
<wsdl:types>
    <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://util.java/xsd">
        <xs:complexType name="Map">
            <xs:sequence>
                <xs:element minOccurs="0" name="empty" type="xs:boolean"/>
            </xs:sequence>
        </xs:complexType>
    </xs:schema>
    <xs:schema xmlns:ax22="http://util.java/xsd" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://service.icomet.com">
        <xs:import namespace="http://util.java/xsd"/>
        <xs:element name="validateUser">
                <xs:complexType>
                <xs:sequence>
                    <xs:element name="user" nillable="true" type="xs:string"/>
                    <xs:element name="userPassword" nillable="true" type="xs:string"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
</xs:schema>
</wsdl:types>
<wsdl:message name="validateUserRequest">
    <wsdl:part name="parameters" element="ns:validateUser"/>
</wsdl:message>

После следования в коде org.apache.axis2.rpc.receivers.RPCMessageReceiver, org.apache.axis2.rpc.receivers.RPCUtil и org.apache.axis2.databinding.utils.BeanUtil то, что я вижу, - сервис, получающий мой запрос с неповрежденными параметрами. OMElement напечатан в журнале от:

BeanUtil.deserialize (ответ OMElement, Object [] javaTypes, ObjectSupplier (objectSupplier) выглядит следующим образом: десериализация (ответ OMElement, Object [] javaTypes, ObjectSupplier (ObjectSupplier)

выглядит так:

<SOAP-ENV:Body xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<ns:validateUser xmlns:ns="http://service.icomet.com">
  <ns:user>test</ns:user>
  <ns:userPassword>values</ns:userPassword>
</ns:validateUser>

После звонка, чтобы получить детей от OMElement и глядя на первого ребенка вышеупомянутого OMElement, я вижу это:

<ns:validateUser xmlns:ns="http://service.icomet.com">
  <ns:user>test</ns:user>
  <ns:userPassword>values</ns:userPassword>
</ns:validateUser>

Вызов getText () для вышеуказанного OMElement возвращает несколько пустых строк в журнале.

Я добавил следующий метод:

    private static void showElement(OMElement omElement) {
    System.out.println("onElement class:" + omElement.getClass().getName());
    System.out.println("omElement:" + omElement);
    System.out.println("omElement.getText:" + omElement.getText());
    for (Iterator it = omElement.getChildElements(); it.hasNext();) {
        Object object = it.next();
        System.out.println("child class name:" + object.getClass().getName());
        System.out.println("child to string:" + object);

    }

    for (Iterator it = omElement.getAllAttributes(); it.hasNext();) {
        OMAttribute object = (OMAttribute) it.next();
        System.out.println("OMAttribute:" + object.getAttributeValue());
    }
}

классу BeanUtil, чтобы лучше рассмотреть этот OMElement. Этот код возвращает следующее:

onElement class:org.apache.axiom.om.impl.llom.OMElementImpl
omElement:<ns:validateUser xmlns:ns="http://service.icomet.com">
  <ns:user>test</ns:user>
  <ns:userPassword>values</ns:userPassword>
</ns:validateUser

omElement.getText:

child class name:org.apache.axiom.om.impl.llom.OMElementImpl
child to string:<ns:user xmlns:ns="http://service.icomet.com">test</ns:user>
child class name:org.apache.axiom.om.impl.llom.OMElementImpl
child to string:<ns:userPassword xmlns:ns="http://service.icomet.com">values</ns:userPassword>

Итак, я вижу значения. Они прибывают и входят в дверь, так сказать. Однако из-за того, что org.apache.axis2.databinding.typemapping.SimpleTypeMapper.getSimpleTypeObject вызывает getText для OMElement и возвращает пустую строку, метод RPCUtil.processRequest возвращает массив объектов с пустой строкой и нулевым объектом и это передается в POJO.

Я знаю, это длинный вопрос, но я подумал, что я мог бы также добавить всю эту информацию заранее.

1 Ответ

1 голос
/ 14 января 2011

Оказывается, ошибка в AXIS2 1.5.

Некоторые детали можно найти здесь

Дефект был устранен в ночной сборке 06.01.2011. Все еще жду подтверждения относительно того, что именно было сделано, чтобы решить проблему. В обсуждении обсуждалась пара решений.

Я использовал самый очевидный на данный момент ответ и сам исправил код.

...