Enviar List<Classe> como parâmetro para Web Service [RESOLVIDO]

13 respostas
M

Boa tarde,

estou usando KSOAP2 e estou tentando enviar um List para um Web Service, mas está dando o erro:

03-16 15:47:08.740: WARN/System.err(1510): java.lang.RuntimeException: Cannot serialize: [br.com.chb.ferracini.webservice.ModeloWS@4107b568]

Neste caso, teria que serializar a classe ModeloWS?
Se sim, como poderia fazer isso?

Desde já agradeço!

Abraço!

13 Respostas

WRYEL
public class SuaClasse implements java.io.Serializable {

}

aproveite, e leia este conteudo: http://www.devmedia.com.br/introducao-a-serializacao-de-objetos/3050

[]'s

M

Continuou dando o erro.
Veja se estou fazendo corretamente:

...
          List<ModeloWS> listaws = new ArrayList<ModeloWS>();
							
		for(int i = 0; i < Itemped.listaModelosSelecionados.size(); i++){
			
			
			ModeloWS modelo = new ModeloWS();
			
			
			modelo.PC17Seq 		= 1;//i;
			modelo.PC17Modelo	= "teste";
			modelo.PC17Cor		= 1;
			modelo.PC13grade	= "Teste";
			modelo.PC17VrUnit	= 4;
			
			
			
			FileOutputStream fo = new FileOutputStream("/sdcard/Download/test.ser");
			ObjectOutputStream oo = new ObjectOutputStream(fo);
			oo.writeObject(modelo);
			
			listaws.add(modelo);
	
			oo.close();
		}
		
		
		soap.addProperty("Xsdt", listaws);

...
felipebonezi

Porque você não tenta enviar pro um array de bytes? :slight_smile:
Ou então, por json?

M

Nunca utilizei json.
Poderia postar algum exemplo?

jonathan_Coelho

Opa
http://lmgtfy.com.br/?q=JsonArray+android

C_k

Amigo !!
a resolução do seu problema está aqui !!
é muito simples fazer isso !!
passar um objeto com ksoap 2.

M

Obrigado galera, ajudou bastante!

Consegui enviar para o webservice usando o KSOAP criando outros SoapObject e adicionando as propriedades com o PropertyInfo.
Só que o webservice esta me retornando isso:

anyType{faultcode=SOAP-ENV:Client; faultstring=Error reading n0:Execute

onde o “Execute” é o método que estou chamando.
Alguém sabe o que poderia ser? Já procurei em vários lugares e não achei a solução.

Obrigado mais uma vez!

Abraço!

M

C;k ,
após serializar a classe dessa maneira, é só adicionar elas em um List<> ( ou ArrayList<>) e adicionar nas propriedades do SoapObject?

Ataxexe

Não use ArrayList como parâmetros de WebService. Use arrays mesmo pois o webservice precisa ser independente da linguagem (o PHP, por exemplo, não ‘saberia’ criar um ArrayList).

Se você realmente precisar expor coisas relativas à linguagem, creio que RMI possa ser mais útil nesse caso.

C_k

Sim mas a sua classe de ArrayList que você passará por parametro tem que estar identica igualzinha a sua classe de ArrayList que recebe como parametro.

ficaria assim no caso !!! tipo simulando

[b] Usuario usuario = new Usuario();

usuario.Codigo = 156;
		usuario.Login = Ck;
		usuario.Senha = 123456; [/b]
		
      
		PropertyInfo propertyInfo  = new PropertyInfo();
 	  
		propertyInfo.setName("usuario"); > Parametro do seu Ws.
		propertyInfo.setValue(usuario); > Seu objeto como parametro.
		propertyInfo.setType(Usuario.class); > Sua classe serializada.

Isto que o Ataxexe disse é fato.

Post 26/03/2012 18:30:07 Assunto: Re:Enviar List como parâmetro para Web Service
Não use ArrayList como parâmetros de WebService. Use arrays mesmo pois o webservice precisa ser independente da linguagem (o PHP, por exemplo, não ‘saberia’ criar um ArrayList).

Se você realmente precisar expor coisas relativas à linguagem, creio que RMI possa ser mais útil nesse caso.

matheusms:
C;k ,
após serializar a classe dessa maneira, é só adicionar elas em um List<> ( ou ArrayList<>) e adicionar nas propriedades do SoapObject?

M

Tentei desse jeito mas deu erro:

03-28 10:07:00.820: WARN/System.err(3419): java.lang.RuntimeException: Cannot serialize: [br.com.webservice.ModeloWS@408e5ef8, br.com.webservice.ModeloWS@408e6cb0, br.com.webservice.ModeloWS@408e76d8]

...

int seq = 1;
				for(int m = 0; m < listaItensPedido.size(); m++){
					PedidoItem item = listaItensPedido.get(m);
					
					ModeloWS modelo = new ModeloWS();
					
					modelo.PC17Seq 		= seq;
					modelo.PC17Modelo	= item.modeloVariacao;
					modelo.PC17Cor		= item.idCor;
					modelo.PC13grade	= item.gradeCodigo;
					modelo.PC17VrUnit	= item.pedidoItemValor;
					modelo.PC17Tam		= item.pedidoItemQuantidade;

					
					listaItens.add(modelo);
					
					seq += 1;
				}
				
				PropertyInfo propertyInfo  = new PropertyInfo();
				
				propertyInfo.setName("Xsdt");
				propertyInfo.setValue(listaItens);
				propertyInfo.setType(ModeloWS.class);
				
				soap.addProperty(propertyInfo);

...

Desculpe minha ignorância, mas sou iniciante em webservice ainda e estou apanhando muito disso hauhau
Se puderem ajudar novamente eu agradeço!

Abraço!

C_k

Tem esses massetes aqui tambem.
você cololou a sua classe de list identica a do web service !
tudo até os parametros Letras maisculas e minusculas.?
a classe que vai ser serializada como parametro tem que ser identica a classe que será recebida pelo Ws.

Usuario usuario = new Usuario();

usuario.Codigo = 156;
usuario.Login = Ck;
usuario.Senha = 123456;


PropertyInfo propertyInfo = new PropertyInfo();

propertyInfo.setName("usuario"); > Parametro do seu Ws.
propertyInfo.setValue(usuario); > Seu objeto como parametro.
propertyInfo.setType(Usuario.class); > Sua classe serializada.

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
envelope.dotNet = true;
envelope.setOutputSoapObject(request); 
envelope.addMapping(NAMESPACE, "Usuario",new Usuario().getClass()); 
HttpTransportSE transport = new HttpTransportSE(URL);
envelope.implicitTypes = true; <<<
transport.call(SOAP_ACTION, envelope);

matheusms:
Tentei desse jeito mas deu erro:

03-28 10:07:00.820: WARN/System.err(3419): java.lang.RuntimeException: Cannot serialize: [br.com.webservice.ModeloWS@408e5ef8, br.com.webservice.ModeloWS@408e6cb0, br.com.webservice.ModeloWS@408e76d8]

...

int seq = 1;
				for(int m = 0; m < listaItensPedido.size(); m++){
					PedidoItem item = listaItensPedido.get(m);
					
					ModeloWS modelo = new ModeloWS();
					
					modelo.PC17Seq 		= seq;
					modelo.PC17Modelo	= item.modeloVariacao;
					modelo.PC17Cor		= item.idCor;
					modelo.PC13grade	= item.gradeCodigo;
					modelo.PC17VrUnit	= item.pedidoItemValor;
					modelo.PC17Tam		= item.pedidoItemQuantidade;

					
					listaItens.add(modelo);
					
					seq += 1;
				}
				
				PropertyInfo propertyInfo  = new PropertyInfo();
				
				propertyInfo.setName("Xsdt");
				propertyInfo.setValue(listaItens);
				propertyInfo.setType(ModeloWS.class);
				
				soap.addProperty(propertyInfo);

...

Desculpe minha ignorância, mas sou iniciante em webservice ainda e estou apanhando muito disso hauhau
Se puderem ajudar novamente eu agradeço!

Abraço!

M

Cara, consegui aqui finalmente!!! haha

Não cheguei a testar esse exemplo que você mandou por ultimo, mas depois vou ver se fica melhor, value mesmo!
Fiz da seguinte maneira aqui:

...

SoapObject soap  = new SoapObject(NAMESPACE, "Execute");
				SoapObject soap2 = new SoapObject(NAMESPACE, "SdtItem.SdtItemItem");
				SoapObject soap3 = new SoapObject(NAMESPACE, "SdtItem");

int seq = 1;
				for(int m = 0; m < listaItensPedido.size(); m++){
					soap2 = new SoapObject(NAMESPACE, "SdtItem.SdtItemItem");
					
					PedidoItem item = listaItensPedido.get(m);
					
					ModeloWS modelo = new ModeloWS();
					
					modelo.PC17Seq 		= seq;
					modelo.PC17Modelo	= item.modeloVariacao;
					modelo.PC17Cor		= item.idCor;
					
					
					soap2.addProperty("PC17Seq", modelo.PC17Seq);
					soap2.addProperty("PC17Modelo", modelo.PC17Modelo);
					soap2.addProperty("PC17Cor", modelo.PC17Cor);
					
					soap3.addSoapObject(soap2);
					
					
					seq += 1;
				}
				
				PropertyInfo propertyInfo  = new PropertyInfo();
				
				propertyInfo.setName("Xsdt");
				propertyInfo.setType(soap3);
				propertyInfo.setValue(soap3);
								
				soap.addProperty(propertyInfo);

...

Demorou mais deu certo! hehe
Valeu a todos que me ajudaram, qualquer coisa to ai pra ajudar no que eu puder tbm!

Abraço!

Criado 16 de março de 2012
Ultima resposta 28 de mar. de 2012
Respostas 13
Participantes 6