Pergunta

UPDATE: eu ter resolvido este problema agora - role PARA BAIXO PARA MAIS INFORMAÇÕES SOBRE FIX

Oi pessoal,

Eu tenho um serviço web escrito em Java, hospedado em um servidor Axis2 / Tomcat / Apache. Meu software cliente é escrito em C #.

Eu tive alguns problemas irritantes com a maneira java2wsdl gera o arquivo WSDL, que me causou algumas dores de cabeça no início, mas com este problema que eu estou completamente perplexo.

Basicamente o que está acontecendo é que o cliente vê a multa serviço web, e envia um perfeitamente válido (ou, pelo menos, parece válida para mim) solicitação SOAP com parâmetros.

No servidor, o método web correta é executada, mas os parâmetros são todos nulos. Meu serviço web detecta isso e constrói uma resposta, que o cliente recebe e entende perfeitamente.

Meu palpite é que Axis2 está caindo plana em seu lugar rosto, mas dadas as dores de cabeça que tive com java2wsdl, talvez todos necessidade I é uma mudança no meu arquivo WSDL.

Aqui está o arquivo wsdl:

    <?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:axis2="http://stws/" xmlns:ns1="http://org.apache.axis2/xsd" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:ns0="http://stws/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://stws/">
    <wsdl:types>
        <xs:schema xmlns:ns="http://stws/xsd" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://stws/xsd">
            <xs:element name="GetGroups">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element minOccurs="0" name="serialcode" nillable="true" type="xs:string"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="GetGroupsResponse">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element maxOccurs="unbounded" minOccurs="0" name="return" nillable="true" type="ns0:Group"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:complexType name="Group">
                <xs:sequence>
                    <xs:element minOccurs="0" name="ID" type="xs:int"/>
                    <xs:element minOccurs="0" name="Name" nillable="true" type="xs:string"/>
                </xs:sequence>
            </xs:complexType>
            <xs:element name="GetMessages">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element minOccurs="0" name="serialcode" nillable="true" type="xs:string"/>
                        <xs:element maxOccurs="unbounded" minOccurs="0" name="groupids" type="xs:int"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="GetMessagesResponse">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element maxOccurs="unbounded" minOccurs="0" name="return" nillable="true" type="ns0:Message"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:complexType name="Message">
                <xs:sequence>
                    <xs:element minOccurs="0" name="date" nillable="true" type="xs:string"/>
                    <xs:element minOccurs="0" name="group" type="xs:int"/>
                    <xs:element minOccurs="0" name="messageID" type="xs:int"/>
                    <xs:element minOccurs="0" name="text" nillable="true" type="xs:string"/>
                </xs:sequence>
            </xs:complexType>
        </xs:schema>
    </wsdl:types>
    <wsdl:message name="GetMessagesRequest">
        <wsdl:part name="parameters" element="ns0:GetMessages"/>
    </wsdl:message>
    <wsdl:message name="GetMessagesResponse">
        <wsdl:part name="parameters" element="ns0:GetMessagesResponse"/>
    </wsdl:message>
    <wsdl:message name="GetGroupsRequest">
        <wsdl:part name="parameters" element="ns0:GetGroups"/>
    </wsdl:message>
    <wsdl:message name="GetGroupsResponse">
        <wsdl:part name="parameters" element="ns0:GetGroupsResponse"/>
    </wsdl:message>
    <wsdl:portType name="MyProjectPortType">
        <wsdl:operation name="GetMessages">
            <wsdl:input message="axis2:GetMessagesRequest" wsaw:Action="urn:GetMessages"/>
            <wsdl:output message="axis2:GetMessagesResponse" wsaw:Action="urn:GetMessagesResponse"/>
        </wsdl:operation>
        <wsdl:operation name="GetGroups">
            <wsdl:input message="axis2:GetGroupsRequest" wsaw:Action="urn:GetGroups"/>
            <wsdl:output message="axis2:GetGroupsResponse" wsaw:Action="urn:GetGroupsResponse"/>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="MyProjectSOAP11Binding" type="axis2:MyProjectPortType">
        <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
        <wsdl:operation name="GetMessages">
            <soap:operation soapAction="urn:GetMessages" style="document"/>
            <wsdl:input>
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
        <wsdl:operation name="GetGroups">
            <soap:operation soapAction="urn:GetGroups" style="document"/>
            <wsdl:input>
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:binding name="MyProjectSOAP12Binding" type="axis2:MyProjectPortType">
        <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
        <wsdl:operation name="GetMessages">
            <soap12:operation soapAction="urn:GetMessages" style="document"/>
            <wsdl:input>
                <soap12:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap12:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
        <wsdl:operation name="GetGroups">
            <soap12:operation soapAction="urn:GetGroups" style="document"/>
            <wsdl:input>
                <soap12:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap12:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:binding name="MyProjectHttpBinding" type="axis2:MyProjectPortType">
        <http:binding verb="POST"/>
        <wsdl:operation name="GetMessages">
            <http:operation location="MyProject/GetMessages"/>
            <wsdl:input>
                <mime:content type="text/xml" part="GetMessages"/>
            </wsdl:input>
            <wsdl:output>
                <mime:content type="text/xml" part="GetMessages"/>
            </wsdl:output>
        </wsdl:operation>
        <wsdl:operation name="GetGroups">
            <http:operation location="MyProject/GetGroups"/>
            <wsdl:input>
                <mime:content type="text/xml" part="GetGroups"/>
            </wsdl:input>
            <wsdl:output>
                <mime:content type="text/xml" part="GetGroups"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="MyProject">
        <wsdl:port name="MyProjectSOAP11port_http" binding="axis2:MyProjectSOAP11Binding">
            <soap:address location="http://localhost:8080/axis2/services/MyProject"/>
        </wsdl:port>
        <wsdl:port name="MyProjectSOAP12port_http" binding="axis2:MyProjectSOAP12Binding">
            <soap12:address location="http://localhost:8080/axis2/services/MyProject"/>
        </wsdl:port>
        <wsdl:port name="MyProjectHttpport" binding="axis2:MyProjectHttpBinding">
            <http:address location="http://localhost:8080/axis2/services/MyProject"/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

E aqui está um exemplo de solicitação e resposta:

Pedido:

<?xml version='1.0' encoding='utf-8'?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soap:Body>
    <GetGroups xmlns="http://stws/xsd">
      <serialcode>123456-654321</serialcode>
    </GetGroups>
  </soap:Body>
</soap:Envelope>

Resposta

<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Body>
    <GetGroupsResponse xmlns="http://stws/xsd">
      <return>
        <ID>-101</ID>
        <name>ERROR: Empty Serial</name>
      </return>
    </GetGroupsResponse>
  </soapenv:Body>
</soapenv:Envelope>

Alguém tem alguma idéia do que poderia estar acontecendo de errado?

A mensagem de erro na resposta só pode ser enviada quando o parâmetro serialcode no pedido está vazio / nulo, então eu estou supondo que há algo errado com a forma como Axis2 está lendo meus parâmetros.

Qualquer ajuda é muito apreciada.

=============================================== =============

como corrigir isso:

Esta é em resposta ao pedido de Aldo para mais informações sobre como eu fixo este problema.

Eu tenho certeza de por que essa correção funciona - talvez seja apenas um bug no Axis2 ou algo assim. De qualquer maneira, YMMV como eu não sei se o problema foi causado por minha configuração ou outra coisa. Tudo o que posso dizer é que, ao fazer o seguinte, tudo começou a trabalhar.

De qualquer forma, o arquivo WSDL gerado automaticamente cria tipos de complexos de elementos para solicitações da web e seus parâmetros, mesmo quando os únicos parâmetros são tipos simples, como cordas ou inteiros. O que fiz foi passar e criar as tags do tipo simples corretos para os parâmetros (como 'serialcode' ou 'data-string'), em seguida, substituir as referências aos tipos complexos em outras partes do arquivo WSDL com referências aos tipos simples.

Um exemplo é abaixo:

método WSDL gerado Auto e parâmetros

<!--Requests-->    
<wsdl:message name="RegisterClientRequest">
    <wsdl:part name="parameters" element="ns0:RegisterClient"/>
</wsdl:message>
<wsdl:message name="GetGroupsRequest">
    <wsdl:part name="parameters" element="ns0:GetGroups"/>
</wsdl:message>

<!--Parameters-->
<xs:element name="RegisterClient">
    <xs:complexType>
        <xs:sequence>
           <xs:element minOccurs="0" name="serialcode" nillable="true" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>
<xs:element name="GetGroups">
    <xs:complexType>
        <xs:sequence>
            <xs:element minOccurs="0" name="serialcode" nillable="true" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
 </xs:element>

Basicamente o que você deve fazer é descartar os parâmetros gerados automaticamente e criar simples-tipos. Você, então, modificar as tags 'pedido' para usar 'type' em vez de 'elemento', e usar suas simples tipos de recém-criadas.

Modificado / Fixo WSDL

<!--Requests-->    
<wsdl:message name="RegisterClientRequest">
    <wsdl:part name="parameters" type="ns0:SerialCode"/>
</wsdl:message>
<wsdl:message name="GetGroupsRequest">
    <wsdl:part name="parameters" type="ns0:SerialCode"/>
</wsdl:message>

<!--Parameters-->
<xs:simpleType name="SerialCode">
    <xs:restriction base="xs:string"/>
</xs:simpleType>

Obviamente isso depende do que seus parâmetros são realmente. No meu caso são todos os tipos simples padrão, tais como strings e inteiros. Se você estiver passando mais de um parâmetro, você pode precisar de brincar, retendo os elementos gerados automaticamente, mas certificando-se que o elemento refere-se a tipos simples em vez de apenas incluindo o atributo type como 'xs: string' ou algo dessa natureza .

Desculpas Não posso ser mais claro sobre isso, mas como eu disse anteriormente -. Eu não sei por que isso funciona

Uma última coisa: Ao remover o 'elemento' atributo de referência nas tags pedido - você pode receber um aviso analisador em seus registros do Axis2. Até agora isso não me causou nenhum problema, mas é algo estar cientes de no caso de você ter problemas.

Foi útil?

Solução

Eu resolvi esse problema, passando por meu arquivo WSDL e, sempre que possível, quebrar elementos em suas contrapartes de tipo simples e atualizar as referências entre os elementos XML conformidade.

Não tenho a certeza por que isso funciona, mas resolveu o meu problema de qualquer maneira.

Outras dicas

Se você tivesse um atributo complexo é assim que você poderia fazê-lo

Antes

 <xs:element name="getMyMenu">
            <xs:complexType>
                <xs:sequence>
                    <xs:element minOccurs="0" name="number" nillable="true" type="xs:string"/>
                    <xs:element minOccurs="0" name="var2" nillable="true" type="xs:string"/>
                    <xs:element minOccurs="0" name="var3" nillable="true" type="xs:string"/>
                    <xs:element minOccurs="0" name="var4" nillable="true" type="xs:string"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>

Depois

            <xs:complexType name="getMyMenu">
                <xs:sequence>
                    <xs:element minOccurs="0" name="number" nillable="true" type="xs:string"/>
                    <xs:element minOccurs="0" name="var2" nillable="true" type="xs:string"/>
                    <xs:element minOccurs="0" name="var3" nillable="true" type="xs:string"/>
                    <xs:element minOccurs="0" name="var4" nillable="true" type="xs:string"/>
                </xs:sequence>
            </xs:complexType>

E, em seguida, alterar esta

<wsdl:message name="getMyMenuRequest">
    <wsdl:part name="parameters" type="ns0:getUssdMenu"/>
</wsdl:message>

Para

<wsdl:message name="getMyMenuRequest">
    <wsdl:part name="parameters" type="ns:getUssdMenu"/>
</wsdl:message>

Isso deve ser isso! Ele fez isso por mim ....

Este é apenas um palpite, mas talvez você está tendo um problema de namespace. Se você se concentrar sobre esta parte do WSDL, aviso que o seu parâmetro tem um namespace "ns0" para os elementos, mas em suas operações definidas mais tarde, parece que você está usando um namespace "eixo2". Com todos os meus WSDLs Axis2 gerados, estes dois namespaces são os mesmos.

<wsdl:message name="GetMessagesRequest">
    <wsdl:part name="parameters" element="ns0:GetMessages"/>
</wsdl:message>
<wsdl:message name="GetMessagesResponse">
    <wsdl:part name="parameters" element="ns0:GetMessagesResponse"/>
</wsdl:message>
<wsdl:message name="GetGroupsRequest">
    <wsdl:part name="parameters" element="ns0:GetGroups"/>
</wsdl:message>
<wsdl:message name="GetGroupsResponse">
    <wsdl:part name="parameters" element="ns0:GetGroupsResponse"/>
</wsdl:message>

<wsdl:portType name="MyProjectPortType">
    <wsdl:operation name="GetMessages">
        <wsdl:input message="axis2:GetMessagesRequest" wsaw:Action="urn:GetMessages"/>
        <wsdl:output message="axis2:GetMessagesResponse" wsaw:Action="urn:GetMessagesResponse"/>
    </wsdl:operation>
    <wsdl:operation name="GetGroups">
        <wsdl:input message="axis2:GetGroupsRequest" wsaw:Action="urn:GetGroups"/>
        <wsdl:output message="axis2:GetGroupsResponse" wsaw:Action="urn:GetGroupsResponse"/>
    </wsdl:operation>
</wsdl:portType>

Outra coisa que você pode verificar é para verificar se o wsdl que você tem de java2wsdl é o mesmo que é gerado pelo eixo2. A menos que você alterou a configuração padrão de "useoriginalwsdl" em sua services.xml, estes WSDLs pode diferente "look". Eu nunca tive que realizar uma java2wsdl manualmente para obter o meu webservice para funcionar corretamente ...

Então, basicamente, atingiu o seu URL do serviço em um navegador e aderência sobre o? Wsdl no final do url ... você deve obter um WSDL para efeitos de comparação.

Além disso, tem o seu cliente gerar topos de WSDL do servidor em vez de um que é gerado pelo java2wsdl (supondo que você usou originalmente o wsdl de java2wsdl). Mais uma vez, nós nunca teve de passar por um WSDL gerado manualmente em torno de qualquer um ... eles simplesmente consumido aquele gerado dinamicamente a partir do servidor ...

Você já tentou enviar um pedido como este?

<?xml version='1.0' encoding='utf-8'?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soap:Body>
    <request>
      <GetGroups xmlns="http://stws/xsd">
        <serialcode>123456-654321</serialcode>
      </GetGroups>
    </request>
  </soap:Body>
</soap:Envelope>

Todos os meus pedidos têm o pedido tag antes dos parâmetros de solicitação real.

tente o seguinte: 123456-654321

xmlns Coloque = "" para o tag parâmetro. Eu tenho o mesmo problema e eu não sei o que eu posso modificar a fim de receber o parâmetro whitout o xmlnx.

Eu tenho uma outra correção. Eu finalmente descobri que se eu não deixar meu IDE (Netbeans 6.8) gerar o WSDL, em seguida, o serviço web funcionou. Alternativamente, se eu excluí-la, desmarcado a opção e re-implantado, em seguida, ele trabalhou gerar.

Comparando a Netbeans WSDL gerado para um servidor gerado um Notei as seguintes diferenças:

  • xmlns: ns0 = "http: /// xsd"
  • namespace de destino no final do WSDL: tag definições tinha uma barra invertida
  • ns0 usado para escolher os elementos que compõem o wsdl: tag mensagem

remoção de todos estes e reutilização dos funcionou!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top