Problema com Axis 2 para gerar WSDL com parâmetros do tipo Arraylist

Olá pessoal.

Criei um webservice utilizando as ferramentas que vem com o axis2. 
Ele funciona normalmente para tipos primitivos, int, string, etc...
Mas quando tenho algum método que recebe ou retorna um [b]Arraylist[/b], ou até mesmo um [b]int[][/b] ou [b]string[][/b], me parece que o wsdl que é gerado, fica incorreto. 

Veja como fica o método “getStatus”, que recebe um int[] e retorna uma String[], por exemplo:

<xs:element name="getStatus">
  <xs:complexType>
    <xs:sequence>
       <xs:element maxOccurs="unbounded" name="coConteudo" nillable="true" type="xs:int"/>
     </xs:sequence>
  </xs:complexType>
</xs:element>
<xs:element name="getStatusResponse">
  <xs:complexType>
    <xs:sequence>
      <xs:element maxOccurs="unbounded" name="return" nillable="true" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Aparentemente, por causa disso, ao gerar o cliente a partir desde wsdl, o código gerado reconhece “getStatus” como se recebesse um parametro “int” simples. :cry:
Eu estou em dúvida se é o gerador de código java a partir do wsdl que está com problema, ou se é o wsdl não está sendo gerado corretamente. :roll:
Estou usando as próprias ferramantas do site da apache: http://ws.apache.org/axis2/tools/index.html

Alguem aí tem alguma idéia do que pode estar ocorrendo e como solucionar isto ?? :?

Abraços.

Será que alguem aí sabe como faz pra passar um Arraylist como parâmetro usando o Axis2 ? :roll:

cara, não sou especialista em web services mas existem algumas recomendações e melhores práticas que acho que vc deveria considerar antes de passar um arraylist (nem sei se dá).

  1. Normalmente os métodos que serão utilizados para atender o webservice tem todos seus parâmetros definidos com tipos simples (String, Number, Double, etc) ou tipos primitivos. Isso pra garantir que o cliente desse webservice seja capaz de entender e desmembrar esses tipos - lembre-se que o cliente não é necessariamente java, pode ser até um .net da vida.

  2. No item acima dá pra perceber que os métodos são fortemente tipados - o tipo do parâmetro é sempre explicitado. Um arraylist (ou list) não diz o conteúdo de si mesmo (no java 5 vc pode dizer isso, com o generics), posso ter qq coisa dentro dessa lista. E aí? como informar o seu conteúdo?

Nunca vi ninguém usando arraylist (como parâmetro ou como retorno) num web service - mas já disse que não sou especialista no assunto …

Implementamos algo semelhante ao que você deseja usando o framework Xtream, nele retornamos uma String que nada mais é que um arquivo xml que pode ser uma lista, no client converta essa String em objeto novamente e percorre essa lista.

http://xstream.codehaus.org/tutorial.html

Exemplo de objeto que representa uma lista:

public class ImpressaoLotesDTO {
	private ArrayList<LoteDTO> lotes;

	public ArrayList<LoteDTO> getLotes() {
		return lotes;
	}

	public void setLotes(ArrayList<LoteDTO> lotes) {
		this.lotes = lotes;
	}
	
}

O ideal para sistemas que usam Web Services é utilizar apenas tipos primitivos. Estruturas mais elaboradas devem ser escritas em formato XML. Tudo isto é feito com o intuito de garantir interoperabilidade, um dos principais objetivos do Web Services.

Abraços

[quote=Pedrosa]http://xstream.codehaus.org/tutorial.html[/quote]Conheço essa lib, ele é bem difundida.
A idéia dela é serializar objetos (grafo completo).

Não acho que isso, para o problema acima, seja uma solução boa. Vc irá, no final das contas, criar uma string contendo xml que será escrita dentro de outro xml??? acho mais fácil escrever uma string com algum delimitador simples …

Então a idéia do Xtream e poder navegar entre os objetos, depedendo da complexidade do seu problema torna-se uma mão na roda.

[quote=Pedrosa]Então a idéia do Xtream e poder navegar entre os objetos, depedendo da complexidade do seu problema torna-se uma mão na roda.[/quote]Concordo, só não gosto de pensar em definir os parâmetros de um webservice como string de xml …

[quote=agodinhost][quote=Pedrosa]http://xstream.codehaus.org/tutorial.html[/quote]Conheço essa lib, ele é bem difundida.
A idéia dela é serializar objetos (grafo completo).

Não acho que isso, para o problema acima, seja uma solução boa. Vc irá, no final das contas, criar uma string contendo xml que será escrita dentro de outro xml??? acho mais fácil escrever uma string com algum delimitador simples …
[/quote]

Pois é…Era justamente isso que eu estava tentando evitar. Eu não queria ser obrigado a ter que concatenar o resultado em uma string, separando por delimitador.

Será que não existe uma coleção padrão para string não, por exemplo, um vetor de strings (ou outra coisa parecida) que pudesse ser facilmente entendido por qualquer linguagem… :roll:

Se não tiver jeito, vou acabar tendo que concatenar os resultados em um “stringão” com delimitador mesmo. :frowning:

Posso até estar errado, mas eu me lembro que vi um exemplo de um Web Service em .NET que passava um Array e o java entendia aquilo como Arraylist de forma transparente (na verdade acabei de lembrar aqui, era HashMap…ou seja, uma estrutura ainda mais complexa!!) . E utilizava Axis 1 !

Outra coisa: eu já vi exemplos de WS no Axis 1 que passavam Arraylist como parametro. Apesar de que no exemplo o cliente também era JAVA, isso era feito de forma transparente. Acho que o proprio Axis dava um jeito de deixar o xml de forma que um cliente “soubesse” que se tratava de uma coleção. Não sei porque no Axis 2 não dá! Nem mesmo de JAVA para JAVA =/

Cara, deve ter como sim, eu só nunca vi ninguém fazendo isso.

Vc pode definir seus tipos no XSD (antigo DTD), já deve ter lá um tipo pra isso - vou dar uma olhada mais afundo nisso hoje à noite e te respondo mais tarde ok? Isso tb me interessa …

O quê estou em dúvida é que na verdade vc, ao utlizar arraylist (list, map, etc), não está definindo todos os objetos - precisamos definir tb o que estará “dentro” dessa lista …

Vou dar uma estudada melhor

Achei uma discussão num forum gringo que cai como uma luva pro seu caso:

http://forum.java.sun.com/thread.jspa?threadID=5195621&messageID=9776543

Já adianto que o cara aconselha a usar array mesmo. Usando ArrayList (List) vc estaria ainda limitado a tipos simples.

Vale a pena dar uma lida.