Erro - Axis - Deserializing parameter

6 respostas
T

Olá.
Tenho um WebService PHP (SOAP).
Depois de algumas horinhas de testes, consegui criar um cliente java que se comunica perfeitamente com o webservice.
Todos os meu métodos que retornam um tipo primitivo ( integer, etc…) e strings, são recebidos maravilhosamente no java. Mas, quando eu tento retornar um objeto do php, aí que apareceu o problema.
Pra ilustrar um exemplo tenho uma classe assim:
class Retorno{
public function…

public function…

public function get_object(){

return new Retorno();

}

}

São vários métodos, e um retorna uma instancia da propria classe. Isso pra efeito de testes mesmo. Quando recebo esse objeto no java, vem pra mim o seguinte erro:


org.apache.axis.client.Call invoke

SEVERE: Exception:

org.xml.sax.SAXException: Deserializing parameter get_objectReturn:  could not find deserializer for type {urn:Retorno}Retorno

at org.apache.axis.message.RPCHandler.onStartChild(RPCHandler.java:277)

at org.apache.axis.encoding.DeserializationContext.startElement(DeserializationContext.java:1035)

at org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java:165)

at org.apache.axis.message.MessageElement.publishToHandler(MessageElement.java:1141)

at org.apache.axis.message.RPCElement.deserialize(RPCElement.java:345)

at org.apache.axis.message.RPCElement.getParams(RPCElement.java:384)

at org.apache.axis.client.Call.invoke(Call.java:2467)

at org.apache.axis.client.Call.invoke(Call.java:2366)

at org.apache.axis.client.Call.invoke(Call.java:2391)

at Client$TratarEventos.conectar(Client.java:130)

at Client$TratarEventos.actionPerformed(Client.java:104)

at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)

at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)

at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)

at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)

at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)

at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:272)

at java.awt.Component.processMouseEvent(Component.java:6041)

at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)

at java.awt.Component.processEvent(Component.java:5806)

at java.awt.Container.processEvent(Container.java:2058)

at java.awt.Component.dispatchEventImpl(Component.java:4413)

at java.awt.Container.dispatchEventImpl(Container.java:2116)

at java.awt.Component.dispatchEvent(Component.java:4243)

at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)

at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)

at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)

at java.awt.Container.dispatchEventImpl(Container.java:2102)

at java.awt.Window.dispatchEventImpl(Window.java:2440)

at java.awt.Component.dispatchEvent(Component.java:4243)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)

at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)

at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

AxisFault

faultCode: {<a href="http://schemas.xmlsoap.org/soap/envelope/">http://schemas.xmlsoap.org/soap/envelope/</a>}Server.userException

faultSubcode:

faultString: org.xml.sax.SAXException: Deserializing parameter get_objectReturn:  could not find deserializer for type {urn:Retorno}Retorno

faultActor:

faultNode:

faultDetail:

{<a href="http://xml.apache.org/axis/">http://xml.apache.org/axis/</a>}stackTrace:org.xml.sax.SAXException: Deserializing parameter ‘get_objectReturn’:  could not find deserializer for type {urn:Retorno}Retorno

at org.apache.axis.message.RPCHandler.onStartChild(RPCHandler.java:277)

at org.apache.axis.encoding.DeserializationContext.startElement(DeserializationContext.java:1035)

at org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java:165)

at org.apache.axis.message.MessageElement.publishToHandler(MessageElement.java:1141)

at org.apache.axis.message.RPCElement.deserialize(RPCElement.java:345)

at org.apache.axis.message.RPCElement.getParams(RPCElement.java:384)

at org.apache.axis.client.Call.invoke(Call.java:2467)

at org.apache.axis.client.Call.invoke(Call.java:2366)

at org.apache.axis.client.Call.invoke(Call.java:2391)

at Client$TratarEventos.conectar(Client.java:130)

at Client$TratarEventos.actionPerformed(Client.java:104)

at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)

at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)

at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)

at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)

at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)

at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:272)

at java.awt.Component.processMouseEvent(Component.java:6041)

at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)

at java.awt.Component.processEvent(Component.java:5806)

at java.awt.Container.processEvent(Container.java:2058)

at java.awt.Component.dispatchEventImpl(Component.java:4413)

at java.awt.Container.dispatchEventImpl(Container.java:2116)

at java.awt.Component.dispatchEvent(Component.java:4243)

at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)

at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)

at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)

at java.awt.Container.dispatchEventImpl(Container.java:2102)

at java.awt.Window.dispatchEventImpl(Window.java:2440)

at java.awt.Component.dispatchEvent(Component.java:4243)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)

at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)

at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
{http://xml.apache.org/axis/}hostname: meuhost
org.xml.sax.SAXException: Deserializing parameter get_objectReturn:  could not find deserializer for type {urn:Retorno}Retorno

at org.apache.axis.AxisFault.makeFault(AxisFault.java:101)

at org.apache.axis.client.Call.invoke(Call.java:2470)

at org.apache.axis.client.Call.invoke(Call.java:2366)

at org.apache.axis.client.Call.invoke(Call.java:2391)

at Client$TratarEventos.conectar(Client.java:130)

at Client$TratarEventos.actionPerformed(Client.java:104)

at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)

at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)

at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)

at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)

at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)

at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:272)

at java.awt.Component.processMouseEvent(Component.java:6041)

at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)

at java.awt.Component.processEvent(Component.java:5806)

at java.awt.Container.processEvent(Container.java:2058)

at java.awt.Component.dispatchEventImpl(Component.java:4413)

at java.awt.Container.dispatchEventImpl(Container.java:2116)

at java.awt.Component.dispatchEvent(Component.java:4243)

at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)

at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)

at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)

at java.awt.Container.dispatchEventImpl(Container.java:2102)

at java.awt.Window.dispatchEventImpl(Window.java:2440)

at java.awt.Component.dispatchEvent(Component.java:4243)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)

at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)

at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

Caused by: org.xml.sax.SAXException: Deserializing parameter get_objectReturn:  could not find deserializer for type {urn:Retorno}Retorno

at org.apache.axis.message.RPCHandler.onStartChild(RPCHandler.java:277)

at org.apache.axis.encoding.DeserializationContext.startElement(DeserializationContext.java:1035)

at org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java:165)

at org.apache.axis.message.MessageElement.publishToHandler(MessageElement.java:1141)

at org.apache.axis.message.RPCElement.deserialize(RPCElement.java:345)

at org.apache.axis.message.RPCElement.getParams(RPCElement.java:384)

at org.apache.axis.client.Call.invoke(Call.java:2467)

 30 more

Procurei bastante e li muita coisa sobre como fazer o unserialize e serialize. Mas todo material que achei falava sobre arquivo, serializar e unserializar aquivos.
Como fazer isso aí com o objeto vindo do WebserviceSOAP PHP, de um jeito simples?
Sei que nao vale nada ilustar, mas se fosse como no php seria beleza, pois existe o serialize e unserialize.
Falta só isso pra eu fechar o WebService e aí começar um projeto de um software.

6 Respostas

Rafael_Nunes

Sugestão1: Evite transmitir objetos, vai te dar mais dor de cabeça do que ajudar. Sempre que possível trafegue Strings e primitivos
Sugestão2: E para transferir objetos, utilize o esquema de complex types no WSDL.
Sugestão3 : De uma pesquisada sobre REST

T

teh_sagaz , vc esta usando nusoap ? esta trabalhando com autenticação ?
eu estou tentando fazer um cliente php se comunicar com o webservice em java e estou recebendo o seguinte erro

HTTP Error: Too many tries to get an OK response (HTTP/1.1 401 Unauthorized)

alguem pode me ajudar ?

obrigado

T

Não estou usando o NuSoap não.
Estou usando o suporte nativo do PHP mesmo.

http://br2.php.net/manual/pt_BR/book.soap.php.

Meu projeto (SERVER PHP / CLIENT JAVA) segue o “contrário” do seu (SERVER JAVA / CLIENT PHP).

Não uso autenticação ainda. O Webservice num primeiro momento vai estar aberto (já que nao vai ser usado para informações confidenciais e outros itens que requerem este tipo de segurança).

T

Rafael Nunes:
Sugestão1: Evite transmitir objetos, vai te dar mais dor de cabeça do que ajudar. Sempre que possível trafegue Strings e primitivos
Sugestão2: E para transferir objetos, utilize o esquema de complex types no WSDL.
Sugestão3 : De uma pesquisada sobre REST

Estou procurando sobre a Sugestão 2 (tenho um pouco de pressa neste projeto).

O que encontrei até agora ainda não consegui absorver corretamente. Mas nada que mais leitura não venha a corrigir.

Minha busca:
http://www.google.com.br/search?q=complex+types+wsdl&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:pt-BR:official&client=firefox-a

esse artigo http://oreilly.com/catalog/webservess/chapter/ch06.html parece ser interessante.
vou “perder um tempo” nele.

você tem alguma coisa que trate especificamente de complex types? exemplos ou outra coisa qualquer?

T

ok , vou ler este link q me enviou e tentar fazer alguns testes usando o suporte nativo do php tambem

obrigado

A

Olá amigo,

Se você ainda não resolveu o problema, você deve verificar algumas coisas…

Bom você deve criar as classes javas que irão receber os objetos.
Tendo feito isso no seu cliente você coloca o seguinte código:

Class beanSR = BeanSerializerFactory.class;
Class beanDR = BeanDeserializerFactory.class;

call.registerTypeMapping(SuaClasse.class, XMLType.XSD_ANYTYPE, beanSR, beanDR);

call.setReturnClass(SuaClasse.class);

No seu caso o nome da sua classe é Retorno, contendo todos os atributos que o seu objeto Retorno do WSDL tem, tanto os nomes quanto os tipos.
Se no caso você utiliza objetos dentro de objetos no retorno do seu método do WSDL você deverá criar as classes correspondentes e executar o método call.registerTypeMapping() como mostrado acima para todas as classes relacionadas.
OBS: o segundo parametro desse método pode também ser específico ao tipo de retorno do atributo no seu WSDL, nesse exemplo estou tratando com o tipo XMLType.XSD_ANYTYP que representa qualquer tipo dentro do XDS.

Espero que ajude!

Criado 1 de agosto de 2008
Ultima resposta 27 de ago. de 2008
Respostas 6
Participantes 4