Serializar um Array ou Vector em Web Services (Axis)

2 respostas
G

estou com uma grande dificuldade em como fazer um web service via Axis retornar um Array de String, ou um Vector, alguma coisa do gênero.

Um Web Service retornando um int ou String, é simples de fazer. Para retornar objetos, arrays, precisa serializar.

O que estou querendo fazer é um cliente J2ME consumir um Web Service em Axis.

No J2ME estou usando os pacotes KSoap e KXML para manipulação de Web Services

Procurei bastante na internet, mas é dificil de achar algo que ajude.

vou dar exemplos simples do que quero fazer:

função (?) do web service que retorna um Vector de Strings:

...
public Vector exibirProdutos()
{
	Vector result = null;
	result.addElement("Mouse");
	result.addElement("Teclado");
	result.addElement("Monitor");
	return result;
}
...

o retorno XML ao invocar o web service está praticamente correto, só nao consegui colar aqui

Cliente J2ME:

...
public void capturaProdutos() throws Exception { 
	try
	{
		String url = "http://localhost:8080/axis/Produtos.jws"; 
			   	  
		SoapObject client = new  SoapObject(url,"exibirProdutos");
		ClassMap classMap = new ClassMap(true);
		classMap.addMapping(url,"Vector",new Vector().getClass());
		HttpTransport ht = new HttpTransport(url,"exibirCategorias");
		ht.setClassMap(classMap);
		ht.debug = true;
		Vector s = (Vector) ht.call(client);
		for (int i = 0; i < s.size(); i++)
		{
			System.out.println((String)s.elementAt(i));
		}

	}
	catch (Exception ex) { 
		System.out.println(ex);
	}
  
}
...

pelo o que entendi, o ClassMap pode mapear a classe para que o Web Service entenda que quero retornar um Vector. Mas não sei se é dessa forma que faz, ja tentei fazer algumas modificações no código, nao achei exemplos claro na internet.

o erro acontece no momento de fazer o "call", no seguinte trecho:

Vector s = (Vector) ht.call(client);

Mensagem de erro:

"java.lang.ClassCastException"!

testei as seguintes formas de mapear:
classMap.addMapping(url,"Vector",new Vector().getClass());
classMap.addMapping(url,"result",new Vector().getClass());

sem sucesso!

é um trabalho de tcc, agradeço qualquer dica e ajuda
obrigado

2 Respostas

G

após 3 dias tentando, obtive este resultado:

o call do meu código retorna um SoapObject

consegui ler o retorno desta forma:

...
SoapObject result = (SoapObject) ht.call (client);
for (int i=0; i< result.getPropertyCount(); i++)
	System.out.println( result.getProperty(i).toString() );
...

o objeto result possui o metodo getProperty, que retorna as strings que estavam dentro do Vector

ficou estranho, pois para pegar o resultado, nao funcionava jogando o resultado num Vector

do jeito que está ai, consigo utilizar apenas para retornar um “array” de tipos primitivos

pra mim ja serve como quebra galho, mas seria bom se conseguisse retornar um array de objetos, que deve ser muito util em aplicações

se alguem puder ainda ajudar, agradeço

G

o retorno do web service está com problemas com caracteres acentuados

ele retorna no encoding “UTF-8”

<?xml version="1.0" encoding="UTF-8"?>

para aceitar esses caracteres, precisaria que retornasse no encoding “ISO-8859-1”

alguem tem uma luz?? acredito que isso esteja definido no axis ou maquina virtual do java

vasculhei alguns arquivos do axis e nao achei nada sobre alterar o encoding do xml

Criado 11 de maio de 2006
Ultima resposta 12 de mai. de 2006
Respostas 2
Participantes 1