WSDL-Axis2 CodeGen Проблема - PullRequest
       9

WSDL-Axis2 CodeGen Проблема

0 голосов
/ 12 августа 2010

У меня проблема с отправкой запроса WS на сервер.Похоже, что Пространство имен (NS) в одном из ComplexTypes типов операций вызывает выброс xsi:type как часть сгенерированного запроса SOAP.

Ниже приведен пример WSDL:

<xs:complexType name="SubscribeAppendantProductRequest"><br> <xs:complexContent><br> <xs:extension base="business:Common"><br> <xs:sequence><br> <xs:element maxOccurs="unbounded" name="Product"><br> <xs:complexType><br> <xs:complexContent><br> <xs:extension base="business:Product"><br> <xs:sequence><br> <xs:element maxOccurs="unbounded" minOccurs="0" name="Service" type="business:Service" /><br> <xs:element minOccurs="0" name="EffectiveDate" type="xs:string" /><br> <xs:element minOccurs="0" name="ExpireDate" type="xs:string" /><br> <xs:element name="ValidMode" type="business:ValidMode" /><br> </xs:sequence><br> </xs:extension><br> </xs:complexContent><br> </xs:complexType><br> </xs:element><br> <xs:element minOccurs="0" name="HandlingChargeFlag" type="xs:int" /><br> <xs:element minOccurs="0" name="CustID" type="xs:string" /><br> </xs:sequence><br> </xs:extension><br> </xs:complexContent><br> </xs:complexType>

См. Ниже код, генерирующий запрос на операцию / заглушку Axis2:

SubscribeAppendantProductRequest sub_req = new SubscribeAppendantProductRequest();<br> Product_type2 subscribedToProduct = new Product_type2();<br> subscribedToProduct.setId(productKey);<br> subscribedToProduct.setValidMode(ValidMode.value1);<br> Product_type2 []subscribedProductList = new Product_type2[1];<br> subscribedProductList[0]=subscribedToProduct;<br> sub_req.addProduct(subscribedToProduct);<br> sub_req.setProduct(subscribedProductList);<br> sub_req.setSubscriberNo(subscriber);<br> return sub_req;

Каждый раз, когда я отправляю запрос, яполучите следующее сообщение об ошибке:

Ошибка параметра интерфейса: имеется 1 ошибка проверки XML: недопустимый xsi: введите qname: 'ns2: Product_type2' в элементе SubscribeAppendantProductRequest

См.ниже для сгенерированного запроса SOAP:

<?xml version='1.0' encoding='UTF-8'?><br> <soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><br> <soapenv:Body><br> <ns3:SubscribeAppendantProductRequestMsg xmlns:ns3="http://www.huawei.com/bme/cbsinterface/cbs/businessmgrmsg"><br> <RequestHeader><br> <ns1:CommandId xmlns:ns1="http://www.huawei.com/bme/cbsinterface/common">SubscribeAppendantProduct</ns1:CommandId><br> <ns1:Version xmlns:ns1="http://www.huawei.com/bme/cbsinterface/common">1.0</ns1:Version><br> <ns1:TransactionId xmlns:ns1="http://www.huawei.com/bme/cbsinterface/common">trans001</ns1:TransactionId><br> <ns1:SequenceId xmlns:ns1="http://www.huawei.com/bme/cbsinterface/common">2002396871686</ns1:SequenceId><br> <ns1:RequestType xmlns:ns1="http://www.huawei.com/bme/cbsinterface/common">Event</ns1:RequestType><br> <ns1:SerialNo xmlns:ns1="http://www.huawei.com/bme/cbsinterface/common">2002396871686</ns1:SerialNo><br> </RequestHeader><br> <SubscribeAppendantProductRequest xmlns:ns2="http://www.huawei.com/bme/cbsinterface/cbs/businessmgr" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:SubscribeAppendantProductRequest"><br> <ns2:SubscriberNo>8090547759</ns2:SubscriberNo><br> <ns2:Product xsi:type="ns2:Product_type2"><br> <ns2:Id>121390</ns2:Id><br> <ns2:ValidMode>4050000</ns2:ValidMode><br> </ns2:Product><br> </SubscribeAppendantProductRequest><br> </ns3:SubscribeAppendantProductRequestMsg><br> </soapenv:Body><br> </soapenv:Envelope>

Я полагаю, что проблема связана с базовым расширением сложного типа Product.

Как ни странно, я запустил аналогичную программу для другого типа операции с похожими характеристиками, которая работала нормально.Ниже приведен пример функциональной операции WSDL:

<xs:complexType name="UnSubscribeAppendantProductRequest"><br> <xs:complexContent><br> <xs:extension base="business:Common"><br> <xs:sequence><br> <xs:element maxOccurs="unbounded" name="Product"><br> <xs:complexType><br> <xs:sequence><br> <xs:element name="ProductID" type="xs:string" /><br> <xs:element minOccurs="0" name="ProductOrderKey" type="xs:string" /><br> <xs:element name="ValidMode" type="xs:string" /><br> <xs:element minOccurs="0" name="ExpireDate" type="xs:string" /><br> <xs:element maxOccurs="unbounded" minOccurs="0" name="Service"><br> <xs:complexType><br> <xs:sequence><br> <xs:element name="Id" type="xs:string" /><br> <xs:element maxOccurs="unbounded" name="SimpleProperty" type="business:SimpleProperty" /><br> </xs:sequence><br> </xs:complexType><br> </xs:element><br> </xs:sequence><br> </xs:complexType><br> </xs:element><br> <xs:element minOccurs="0" name="CustID" type="xs:string" /><br> </xs:sequence><br> </xs:extension><br> </xs:complexContent><br> </xs:complexType>

Когда я проводил сравнение, кажется, что они оба используют Product сложный тип, но кажется, что неисправный использует Product сложный тип как расширение.

У кого-нибудь есть опыт работы с этим?Любые возможные решения?Если бы я использовал другую привязку данных (от ADB), все было бы иначе?

1 Ответ

0 голосов
/ 01 сентября 2010

В конце концов я решил использовать формат привязки данных 'xmlbeans' для классов Outputted Generated Java, представляющих операции WSDL.

Похоже, что привязка данных Axis2 (ADB) не обрабатывает WSDL с несколькими сложными типами (которые при преобразовании в код Java возвращают объекты Java), особенно если они настроены с атрибутами XMLSchema maxOccurs='unbounded'.

Когда выходные данные генерируются при использовании ADB, создается впечатление, что отдельный Object_x (где x - целое число в диапазоне от 1..n) создается для каждого сложного типа, называемого Object, для которого требуются различные свойства в зависимости от операции.требования, определенные в документе WSDL.Object_x будет помещен в тот же пакет, что и другие объекты, созданные с помощью wsdl2java.Затем отправленный SOAP-запрос содержит type=Object_x XSD-атрибут, сопровождающий преобразование объекта в SOAP-запрос, как показано в исходном вопросе.

Когда выходные данные генерируются при использовании xmlbeans, класс package.Object имеет видсгенерировано wsdl2java, где пакет - это имя операции, а объект - тип Complex, и кажется, что xmlbeans игнорирует атрибут maxOccurs='unbounded', а в отправленном SOAP-запросе нет параметров типа.

Ну вот как я решил эту проблему.Я отправил отчет об ошибке в группу разработчиков Axis2, но буду продолжать следить за ним, чтобы узнать, будут ли какие-либо разрешения в будущих версиях.

Спасибо всем, кто попробовал.

...