Очень простой сервис Axis1 с клиентом Axis2 вызывает непредвиденное исключение субэлемента - PullRequest
0 голосов
/ 20 сентября 2011

Я перевожу свой клиент webesrvice из Axis в Axis2-1.6.1, но сам сервис не будет изменен.У меня проблемы с кодом, сгенерированным WDSL2Java, потому что я получаю исключение «Неожиданный субэлемент».WDSL довольно прост, поскольку существует только одна служба, и она получает только строку и возвращает дату:

<wsdl:definitions targetNamespace="xml.generator.ws">
    <!--WSDL created by Apache Axis version: 1.4
    Built on Apr 22, 2006 (06:55:48 PDT)-->
    <wsdl:message name="generateToday1Request">
        <wsdl:part name="idCompany" type="xsd:string"/>
    </wsdl:message>
    <wsdl:message name="generateToday1Response">
        <wsdl:part name="generateToday1Return" type="xsd:dateTime"/>
    </wsdl:message>
    <wsdl:portType name="WSGenerator">
        <wsdl:operation name="generateToday1" parameterOrder="idCompany">
            <wsdl:input message="impl:generateToday1Request" name="generateToday1Request"/>
            <wsdl:output message="impl:generateToday1Response" name="generateToday1Response"/>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="ValuationsXMLGeneratorSoapBinding" type="impl:WSGenerator">
        <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="generateToday1">
            <wsdlsoap:operation soapAction=""/>
            <wsdl:input name="generateToday1Request">
                <wsdlsoap:body namespace="http://generacion.stmts.bpi.com" use="literal"/>
            </wsdl:input>
            <wsdl:output name="generateToday1Response">
                <wsdlsoap:body namespace="xml.generator.ws" use="literal"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="WSGeneratorService">
        <wsdl:port binding="impl:ValuationsXMLGeneratorSoapBinding" name="ValuationsXMLGenerator">
            <wsdlsoap:address location="http://naboo:8080/Statements2/services/ValuationsXMLGenerator"/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

Я сгенерировал исходный код со следующими параметрами:

<axis-wsdl2java
    output="${src.java}"
    testcase="false"
    wsdlfilename="http://naboo:8080/Statements2/services/ValuationsXMLGenerator?wsdl"
    serverside="false"
    unpackclasses="true"
    unwrap="true"
    suppressprefixes="true"
    namespacetopackages="xml.generator.ws=com.spb.eco.valuations.xml"
    generateAllClasses="true"/>

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

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
 <soapenv:Body>
  <generateToday1 xmlns="http://generacion.stmts.bpi.com">
   <idCompany xmlns="">US0010001</idCompany>
  </generateToday1>
 </soapenv:Body>
</soapenv:Envelope>

И я получаю следующее:

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <soapenv:Body>
  <generateToday1Response xmlns="http://generacion.stmts.bpi.com">
   <generateToday1Return>2011-09-19T22:56:53.781Z</generateToday1Return>
  </generateToday1Response>
 </soapenv:Body>
</soapenv:Envelope>

И это сервер-config.wsdd для сервера:

<?xml version="1.0" ?>
<deployment
    xmlns="http://xml.apache.org/axis/wsdd/"
    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
    <service name="ValuationsXMLGenerator" provider="java:RPC" style="rpc" use="literal">


        <!-- Nombre de la clase que implementa los metodos expuestos -->
        <parameter name="className" value="com.bpi.stmts.generacion.WSGenerator"/>

        <parameter name="allowedMethods" value="generateToday1"/>
        <parameter name="wsdlTargetNamespace" value="xml.generator.ws"/>
    </service>

    <handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/>
    <handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/>

    <transport name="http">
        <requestFlow>
            <handler type="URLMapper"/>
            <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
        </requestFlow>
        <parameter name="qs:list" value="org.apache.axis.transport.http.QSListHandler"/>
        <parameter name="qs.list" value="org.apache.axis.transport.http.QSListHandler"/>
        <parameter name="qs:wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/>
        <parameter name="qs.wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/>
        <parameter name="qs:method" value="org.apache.axis.transport.http.QSMethodHandler"/>
        <parameter name="qs.method" value="org.apache.axis.transport.http.QSMethodHandler"/>
    </transport>
    <transport name="local">
        <responseFlow>
            <handler type="LocalResponder"/>
        </responseFlow>
    </transport>

</deployment>

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

Причина: org.apache.axis2.databinding.ADBException: неожиданный подэлемент {http://generacion.stmts.bpi.com}generateToday1Return

. В этом случае нет проблем с порядком элементов или чем-то подобным, поэтому я не понимаю, почему происходит сбой клиента.Есть идеи?

TIA

JL

Ответы [ 2 ]

0 голосов
/ 07 марта 2012

Проблема связана со стилем привязки SOAP. В вашем WSDL вы использовали «RPC» в качестве стиля, Axis2 не поддерживает RPC.Я столкнулся с той же проблемой, я протестировал веб-сервис с клиентом Axis1, он работал, но то же самое, что и в Axis2.

Later I have changed the SOAP binding style to DOCUMENT and then I have regenerated the client stubs with Axis2. After that I was able to invoke the Web Services successfully and got the proper response as well. 

 So, Change the SOAP binding style to DOCUMENT. 
0 голосов
/ 20 сентября 2011

Согласно базовому профилю WS-I, у вас не должно быть пространства имен для элемента generateToday1Return. Но ответ у него есть пространство имен. Таким образом, ваш ответ не соответствует файлу wSDL. Для получения дополнительной информации, пожалуйста, посмотрите здесь [1].

[1] http://wso2.org/library/2935

...