Retorno "Array de objeto" / Soap

Pessoal eu estou tendo imensa dificuldade no recebimento de array de objeto, já tentei de todas as formas possíveis e impossíveis, tentei usar o Axis e Ksoap com nenhum dos dois eu pude ser feliz, a pergunta é; Como receber array de objeto “SOAP complexType” pelo Java? Segue o WSDL;

[code]<?xml version="1.0" encoding="ISO-8859-1"?>


<xsd:schema targetNamespace=“urn:wsTabletPedido_server”

<xsd:import namespace=“http://schemas.xmlsoap.org/soap/encoding/” />
<xsd:import namespace=“http://schemas.xmlsoap.org/wsdl/” />
<xsd:complexType name=“TProduto”>
xsd:all
<xsd:element name=“PRO_ID” type=“xsd:string”/>
<xsd:element name=“PRO_NOME” type=“xsd:string”/>
<xsd:element name=“PRO_PRECO_VENDA” type=“xsd:string”/>
</xsd:all>
</xsd:complexType>
<xsd:complexType name=“TListaProduto”>
xsd:complexContent
<xsd:restriction base=“SOAP-ENC:Array”>
<xsd:attribute ref=“SOAP-ENC:arrayType” wsdl:arrayType=“tns:TProduto[]”/>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name=“TPedido”>
xsd:all
<xsd:element name=“PED_ID” type=“xsd:string”/>
<xsd:element name=“USU_ID” type=“xsd:string”/>
<xsd:element name=“PRO_ID” type=“xsd:string”/>
<xsd:element name=“PRO_QTD” type=“xsd:string”/>
<xsd:element name=“MESA” type=“xsd:string”/>
<xsd:element name=“DATAHORA” type=“xsd:string”/>
<xsd:element name=“STATUS” type=“xsd:string”/>
<xsd:element name=“FECHADO” type=“xsd:string”/>
<xsd:element name=“COMENTARIO” type=“xsd:string”/>
<xsd:element name=“PRO_NOME” type=“xsd:string”/>
</xsd:all>
</xsd:complexType>
<xsd:complexType name=“TListaPedido”>
xsd:complexContent
<xsd:restriction base=“SOAP-ENC:Array”>
<xsd:attribute ref=“SOAP-ENC:arrayType” wsdl:arrayType=“tns:TPedido[]”/>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
</xsd:schema>
































Metodo login de usuário…




Metodo lista produto…




Metodo abre novo pedido…




Metodo lista pedido…




Metodo retorna quantidade de pedidos prontos ainda não fechados pelo garçon, idealizado para a thread de aviso de pedidos liberados na cozinha…




Metodo fecha pedido…





<soap:binding style=“rpc” transport=“http://schemas.xmlsoap.org/soap/http”/>

<soap:operation soapAction=“urn:loginUsuario#loginUsuario” style=“rpc”/>
<soap:body use=“encoded” namespace=“urn:loginUsuario” encodingStyle=“http://schemas.xmlsoap.org/soap/encoding/”/>
<soap:body use=“encoded” namespace=“urn:loginUsuario” encodingStyle=“http://schemas.xmlsoap.org/soap/encoding/”/>


<soap:operation soapAction=“urn:listaProduto#listaProduto” style=“rpc”/>
<soap:body use=“encoded” namespace=“urn:listaProduto” encodingStyle=“http://schemas.xmlsoap.org/soap/encoding/”/>
<soap:body use=“encoded” namespace=“urn:listaProduto” encodingStyle=“http://schemas.xmlsoap.org/soap/encoding/”/>


<soap:operation soapAction=“urn:abreNovoPedido#abreNovoPedido” style=“rpc”/>
<soap:body use=“encoded” namespace=“urn:abreNovoPedido” encodingStyle=“http://schemas.xmlsoap.org/soap/encoding/”/>
<soap:body use=“encoded” namespace=“urn:abreNovoPedido” encodingStyle=“http://schemas.xmlsoap.org/soap/encoding/”/>


<soap:operation soapAction=“urn:listaPedidoPronto#listaPedidoPronto” style=“rpc”/>
<soap:body use=“encoded” namespace=“urn:listaPedidoPronto” encodingStyle=“http://schemas.xmlsoap.org/soap/encoding/”/>
<soap:body use=“encoded” namespace=“urn:listaPedidoPronto” encodingStyle=“http://schemas.xmlsoap.org/soap/encoding/”/>


<soap:operation soapAction=“urn:avisoPedidoPronto#avisoPedidoPronto” style=“rpc”/>
<soap:body use=“encoded” namespace=“urn:avisoPedidoPronto” encodingStyle=“http://schemas.xmlsoap.org/soap/encoding/”/>
<soap:body use=“encoded” namespace=“urn:avisoPedidoPronto” encodingStyle=“http://schemas.xmlsoap.org/soap/encoding/”/>


<soap:operation soapAction=“urn:fechaPedido#fechaPedido” style=“rpc”/>
<soap:body use=“encoded” namespace=“urn:fechaPedido” encodingStyle=“http://schemas.xmlsoap.org/soap/encoding/”/>
<soap:body use=“encoded” namespace=“urn:fechaPedido” encodingStyle=“http://schemas.xmlsoap.org/soap/encoding/”/>




<soap:address location=“http://localhost/webservice/index.php”/>


[/code]

Alguém já passou por isso e resolveu? Se resolveu por favor dá uma força aqui, com certeza além de mim vai aparecer muita gente batendo cabeça com isso.

Valeu, abraços.

Algo como:

<xsd:element name="getListResponse">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element maxOccurs="unbounded" minOccurs="0" name="return" nillable="true" type="tns:itemProperty" />
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

Já é para ser considerado uma lista.

[quote=nel]Algo como:

<xsd:element name="getListResponse">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element maxOccurs="unbounded" minOccurs="0" name="return" nillable="true" type="tns:itemProperty" />
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

Já é para ser considerado uma lista.[/quote]

Olá amigão, obrigado pela resposta. E você pode me ajudar a implementar isso em código(Java) e me indicar uma melhor lib que se adapte bem aos complexTypes do SOAP?

Valeu, abc.

[quote=leogazio][quote=nel]Algo como:

<xsd:element name="getListResponse">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element maxOccurs="unbounded" minOccurs="0" name="return" nillable="true" type="tns:itemProperty" />
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

Já é para ser considerado uma lista.[/quote]

Olá amigão, obrigado pela resposta. E você pode me ajudar a implementar isso em código(Java) e me indicar uma melhor lib que se adapte bem aos complexTypes do SOAP?

Valeu, abc.[/quote]

Sim, já trabalhei com JAXBe classes geradas com o wsimport. Se o seu WSDL é estático, ou seja, não vai mudar toda semana, vale a pena e é extramente simples de usar. Ele simplesmente gera objetos de acordo com o seu WSDL.

Abraços.

Opa obrigado mais uma vez. Você poderia me ajudar com a instalação desses plugins amigão? Um dos problemas que eu tive aqui que estão ajudando a me empacar é isso, já tentei instalar no Eclipse os plugins, já tentei instalar o Ksoap codegen, o axis codegen, mas nenhum dos plugins apareceu na janela “New” do meu Eclipse, acabei de tentar instalar também o seguinte plugin do JAXB http://sourceforge.net/projects/jaxb-builder/, mais uma tentativa frustrada. Já coloquei dentro das pastas dropins ou plugins e reiniciei o Eclipse mas não aparece plugin nenhum. Puts eu tô com um projeto empacado aqui só porque não consigo receber “array de objeto” do webservice de jeito nenhum pelo Java. Tem como você me ajudar?

Valeu, abraço.

Ó, no “Leia-me” do plugin tem esse trecho aí no final;

[quote]Installation:
Simply unzip the contents of this zip directly into the plugins/ directory of your
eclipse installation and restart eclipse. The JAXB Wizard can be found under ‘New Project/Java’
options
Note: If the wizard is not available or code generation fails with missing class files; eclipse may need to clean its plugin cache. run eclipse
with the -clean option.[/quote]

Esse “-clean”, onde eu executo esse parâmetro? Essa foi uma coisa que eu não tentei ainda depois de instalar os plugins aqui, eu conheço muito pouco de Eclipse, trabalhava com o Netbeans e fui forçado a usar o Eclipse, tô me adaptando aos poucos…

EDITADO: Pessoal já executei o Eclipse com o parâmetro -clean mas não adiantou nada, o plugin não aparece e eu continuo empacado sem conseguir receber o array de objeto vindo do SOAP. Será mesmo que eu depois de velho cascudo vou ser obrigado a fazer a trepadeira de retornar tudo em uma string com delimitadores só pra isso? Isso seria mesmo horrível!

[quote=leogazio]Ó, no “Leia-me” do plugin tem esse trecho aí no final;

[quote]Installation:
Simply unzip the contents of this zip directly into the plugins/ directory of your
eclipse installation and restart eclipse. The JAXB Wizard can be found under ‘New Project/Java’
options
Note: If the wizard is not available or code generation fails with missing class files; eclipse may need to clean its plugin cache. run eclipse
with the -clean option.[/quote]

Esse “-clean”, onde eu executo esse parâmetro? Essa foi uma coisa que eu não tentei ainda depois de instalar os plugins aqui, eu conheço muito pouco de Eclipse, trabalhava com o Netbeans e fui forçado a usar o Eclipse, tô me adaptando aos poucos…[/quote]

Cara, tanto o JAXB quanto o wsimport são nativos do Java. Se tu tem a JDK instalada em sua máquina e no seu SO tu configurou a variável de ambiente do JAVA nele, basta tu usar no console. Aqui no Windows, por exemplo, se eu abrir o DOS e digitar ‘wsimport’ ele já me apresenta a lista de parâmetros disponíveis, então, nunca usei nenhum plugin pra isso, por isso, nesse caso, em relação a plugin, não tenho como ajuda-lo.

Tenta usar o nativo que é bem rápido e muito fácil ! E o JAXB é só se tu tiver uma String e quiser transformar no Objeto ou vice-versa, porque se é um complexType, o WS já vai lhe retornar um Objeto e basta trabalhar com ele.

[quote=nel][quote=leogazio]Ó, no “Leia-me” do plugin tem esse trecho aí no final;

[quote]Installation:
Simply unzip the contents of this zip directly into the plugins/ directory of your
eclipse installation and restart eclipse. The JAXB Wizard can be found under ‘New Project/Java’
options
Note: If the wizard is not available or code generation fails with missing class files; eclipse may need to clean its plugin cache. run eclipse
with the -clean option.[/quote]

Esse “-clean”, onde eu executo esse parâmetro? Essa foi uma coisa que eu não tentei ainda depois de instalar os plugins aqui, eu conheço muito pouco de Eclipse, trabalhava com o Netbeans e fui forçado a usar o Eclipse, tô me adaptando aos poucos…[/quote]

Cara, tanto o JAXB quanto o wsimport são nativos do Java. Se tu tem a JDK instalada em sua máquina e no seu SO tu configurou a variável de ambiente do JAVA nele, basta tu usar no console. Aqui no Windows, por exemplo, se eu abrir o DOS e digitar ‘wsimport’ ele já me apresenta a lista de parâmetros disponíveis, então, nunca usei nenhum plugin pra isso, por isso, nesse caso, em relação a plugin, não tenho como ajuda-lo.

Tenta usar o nativo que é bem rápido e muito fácil ! E o JAXB é só se tu tiver uma String e quiser transformar no Objeto ou vice-versa, porque se é um complexType, o WS já vai lhe retornar um Objeto e basta trabalhar com ele.[/quote]

Então, o que eu preciso mesmo é só pegar esse array de objeto aí, testei no Delphi, C# e php, nas 3 linguagens eu tive exito e não precisei do uso de nenhuma lib nem plugin, ou coisa do gênero, agora no Java a coisa tá ruim hein, e olha que eu já trabalho com Java há um certo tempo, sobre o “wsimport”, valeu pela dica, eu já tinha testado algumas ferramentas via linha de comando ambas são do axis e ksoap, não funcionaram, o wsimport me retornou a seguinte mensagem;

[quote]C:>wsimport -d c:\codigo\import http://localhost/webservice/index.php?wsdl
parsing WSDL…

[ERROR] "Use of SOAP Encoding is not supported.
SOAP extension element on line 110 in http://localhost/webservice/index.php?wsdl
has use=“encoded” "

    Failed to parse the WSDL.

C:>[/quote]

Esse WSDL que ele não conseguiu importar é exatamente esse que tá aí em cima sem nenhuma diferença. Alguma ideia?

[color=red]EDITADO:[/color] Então, eu tirei todos os use=“encoded” do WSDL aí agora o erro é relacionado justamente aos complexTypes, vê só;

[quote]parsing WSDL…

[WARNING] src-resolve: Não é possível resolver o nome ‘SOAP-ENC:Array’ para um c
omponente ‘type definition’.
line 17 of file:/C:/codigo/wsTabletPedido.wsdl#types?schema1

[ERROR] undefined simple or complex type ‘SOAP-ENC:Array’
line 17 of file:/C:/codigo/wsTabletPedido.wsdl

[ERROR] undefined attribute ‘SOAP-ENC:arrayType’
line 18 of file:/C:/codigo/wsTabletPedido.wsdl

[ERROR] undefined simple or complex type ‘SOAP-ENC:Array’
line 38 of file:/C:/codigo/wsTabletPedido.wsdl

[ERROR] undefined attribute ‘SOAP-ENC:arrayType’
line 39 of file:/C:/codigo/wsTabletPedido.wsdl[/quote]

Desde já meu muito obrigado mais uma vez pela boa vontade de ajudar ao próximo(um simples desconhecido), nem todos são assim, abc.

Cada linguagem, por mais próxima que seja, possuem características próprias. Se com outras você conseguiu, provavelmente está executando erroneamente o comando.
Veja se consegue acessar exatamente o mesmo WSDL com outras linguagens e depois tente novamente no JAVA.

Tente o comando:

wsimport -keep -p br.com.guj.test URL_DO_WS;

Senão conseguir, poste o seu WSDL completo.

[quote=nel]Cada linguagem, por mais próxima que seja, possuem características próprias. Se com outras você conseguiu, provavelmente está executando erroneamente o comando.
Veja se consegue acessar exatamente o mesmo WSDL com outras linguagens e depois tente novamente no JAVA.

Tente o comando:

wsimport -keep -p br.com.guj.test URL_DO_WS;

Senão conseguir, poste o seu WSDL completo.[/quote]

Como eu lhe disse lá em cima amigão, nas 3 linguagens pelas quais eu fiz o teste, não tive dor de cabeça, consumi o “array de objeto” na boa. O meu problema sempre foi no Java consumir complexType do SOAP, na verdade eu já havia tentado anos atrás mas a dor de cabeça foi tanta que eu desisti, agora estou sendo forçado por isso tô aqui tentando denovo…

Acabei de testar o seu comando, segue o resultado;

[quote]parsing WSDL…

[ERROR] "Use of SOAP Encoding is not supported.
SOAP extension element on line 110 in http://localhost/webservice/index.php?wsdl
has use=“encoded” "

    Failed to parse the WSDL.

[/quote]

Anexa o seu WSDL, por favor.
Senão está gerando, há algo errado nele.

[quote=nel]Anexa o seu WSDL, por favor.
Senão está gerando, há algo errado nele.[/quote]

O WSDL é exatamente esse que tá aí em cima no primeiro post do tópico.

Infelizmente, má noticias. Adicionei isso ao seu WSDL:

<xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/" schemaLocation="http://schemas.xmlsoap.org/soap/encoding/"/>/>

O problema é que gerou a exceção ‘rpc/encoded wsdls are not supported in JAXWS 2.0’. Para solucionar isso, substitui use=‘encoded’ por use=‘literal’.
Usei o seguinte comando:

wsimport -keep -p pacote_qualquer -verbose nome_do_wsdl.wsdl

O WSDL está em anexo.

Amigão, me desculpa pela demora na resposta. O import funcionou e gerou o package com todas as classes, só o que o meu problema aqui agora é que todas as classes estão apresentando erros, tá dependendo de alguma coisa que eu não tenho instalada, muitos erros. Alguma ideia?

Puts cara pelo que eu tô vendo aqui as classes geradas pelo wsimport usam o JAXB. Certo ou errado? E pesquisando aqui eu vi que o JAXB no Android não rola. Procede tal informação? Caso não tenha jeito usando as classes geradas pelo wsimport, qual seria uma alternativa?

Cara, é JAXB sim. Você está falando de Mobile, ai foge a minha alçada. Uma equipe “vizinha” da minha na empresa trabalha com Mobile, posso trocar uma ideia com eles para saber se já desenvolveram um cliente WS para Android, por exemplo. Mas tem o AXIS, mas ai é pesquisar, porque realmente nunca desenvolvi nada especifico para mobile assim.

Cara, é JAXB sim. Você está falando de Mobile, ai foge a minha alçada. Uma equipe “vizinha” da minha na empresa trabalha com Mobile, posso trocar uma ideia com eles para saber se já desenvolveram um cliente WS para Android, por exemplo. Mas tem o AXIS, mas ai é pesquisar, porque realmente nunca desenvolvi nada especifico para mobile assim.[/quote]

Puxa você faria isso por mim parceiro? Cara eu até consegui fazer mas a minha aplicação foi pra quase 30mb de tamanho e ficou muito mais pesada(travando inclusive) só por conta de um monte de jars que eu tive que adicionar. Deve ter alguma solução mais compacta pra Android.

Obrigado desde já e abraços.

Oi.

Dá uma olhada no ksoap2, da Google. Parece ser bem “falado” e utilizado .
Aqui tem um post explicando como usar essa biblioteca. Boa sorte.

[quote=nel]Oi.

Dá uma olhada no ksoap2, da Google. Parece ser bem “falado” e utilizado .
Aqui tem um post explicando como usar essa biblioteca. Boa sorte.[/quote]

Não rola não, eu já tentei o KSoap2 e não consegui nem que a vaca tussa, depois de muito pesquisar eu descobri que ele tem um bug na deserialização dos SOAP complex types. Não estou vendo outra alternativa a não ser retornar tudo em string delimitada por algum carácter, assim vai funcionar.