Consumir WebService com Tipo Complexo [resolvido]

5 respostas
afffernando

Bom dia,
estou novamente com problemas com Webservices. Agora o meu problema é como consumir um webService feito em .NET com tipo complexo que tem o seguinte wsdl

<s:element name="ListarMotivoSegundaVia">
  <s:complexType/>
</s:element>
<s:element name="ListarMotivoSegundaViaResponse">
  <s:complexType>
    <s:sequence>
      <s:element minOccurs="0" maxOccurs="1" name="ListarMotivoSegundaViaResult">
        <s:complexType mixed="true">
          <s:sequence>
            <s:any/>
          </s:sequence>
        </s:complexType>
      </s:element>
    </s:sequence>
  </s:complexType>
</s:element>

a classe gerada pelo wsimport é a seguinte

package PortalTUI;

import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlMixed;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "listarMotivoSegundaViaResult"
})
@XmlRootElement(name = "ListarMotivoSegundaViaResponse")
public class ListarMotivoSegundaViaResponse {

    @XmlElement(name = "ListarMotivoSegundaViaResult")
    protected ListarMotivoSegundaViaResponse.ListarMotivoSegundaViaResult listarMotivoSegundaViaResult;

    public ListarMotivoSegundaViaResponse.ListarMotivoSegundaViaResult getListarMotivoSegundaViaResult() {
        return listarMotivoSegundaViaResult;
    }

    public void setListarMotivoSegundaViaResult(ListarMotivoSegundaViaResponse.ListarMotivoSegundaViaResult value) {
        this.listarMotivoSegundaViaResult = value;
    }

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {
        "content"
    })
    public static class ListarMotivoSegundaViaResult {

        @XmlMixed
        @XmlAnyElement(lax = true)
        protected List<Object> content;

        public List<Object> getContent() {
            if (content == null) {
                content = new ArrayList<Object>();
            }
            return this.content;
        }
    }
}

a mensagem de retorno fica com a seguinte estrutura:

<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:Header/>
	<soap:Body>
		<ListarMotivoSegundaViaResponse xmlns="http://tempuri.org/">
			<ListarMotivoSegundaViaResult>
				<motivos xmlns="">
					<motivo>
						<id_segunda_via_motivo>2</id_segunda_via_motivo>
						<descricao_segunda_via_motivo>ATUALIZAÇÃO DE DADOS</descricao_segunda_via_motivo>
					</motivo>
				</motivos>
			</ListarMotivoSegundaViaResult>
		</ListarMotivoSegundaViaResponse>
	</soap:Body>
</soap:Envelope>

porem quando vou tentar recuperar as informações ele não consegue pegar este resultado. quando pego o content de um List obtido ele simplesmente imprime [motivo: null]

alguem sabe o que pode estar acontecendo? é erro no WSDL ou o problema é na classe criada? Preciso de uma nova classe para fazer essa leitura?
desde já, agradeço a todos que tentarem ajudar.
Grato,
Fernando de Almeida

5 Respostas

A

cara,

vc ja tentou utilizar tentou XStream para fazer a conversão de xml para objeto java.

t+

afffernando

Acabei de dar uma olhada nesse XStream e somente para saber se eu entendi corretamente.
Eu pegaria a mensagem de retorno e passaria por esse XStream e iria tratar para pegar o resultado.
É isso mesmo?
mesmo que eu tenha que entendido corretamente, não existe uma maneira sem que tenha que usar essa biblioteca?
grato
Fernando de Almeida

A

cara,

o intuito dele é a conversão do xml em objeto java.
mas acho vc nao queria utilizar, vc vai ter que usar DOM, veja esse artigo, http://www.guj.com.br/articles/22

t+

afffernando

Acredito que o que eu fiz foi o que o alissonvla sugiriu,
Segue como eu resolvi o meu problema, para se alguem chegar aqui procurando a resposta tenha um retorno.

java.util.List res = new java.util.Vector();
        wsportaltui.ListarMotivoSegundaViaResponse.ListarMotivoSegundaViaResult result = port.listarMotivoSegundaVia();
        java.util.List<Object> lista = result.getContent();  
        ElementNSImpl elementNSImpl = (ElementNSImpl) lista.get(0);
        org.w3c.dom.NodeList childNodes = elementNSImpl.getChildNodes();
        for (int i = 0; i < childNodes.getLength(); i++){
            org.w3c.dom.Node node = childNodes.item(i);
            int index = Integer.parseInt(node.getFirstChild().getTextContent());
            String elemento = node.getLastChild().getTextContent();
            res.add(index,elemento);
        }
        
        return res;

não sei se essa é a melhor forma para se resolver isso, porem está funcionando, caso alguem saiba uma maneira diferente(mais simples) eu agradeço.
Att.
Fernando Almeida

jrfercar

Estou tendo um problema para enviar os dados para o PortalTUI

que relatei no link:http://www.guj.com.br/java/298701-consumir-webservice-do-portaltui

Se você puder me dar uma força, eu agradeço.

Estou utilizando o Netbeans, porém quando crio o cliente ws, não aparece nas propriedades de qualidade a opção para configurar o usuário, senha e token.

Por esta razão, estou também tentando conectar e enviar um xml soap na unha, mas também sem sucesso.

Peço, por favor que você, se puder me de uma ajuda para resolver o problema.

desde já agradeço.

Criado 4 de novembro de 2011
Ultima resposta 29 de abr. de 2013
Respostas 5
Participantes 3