Collection em web service

9 respostas
obs

Bom dia pessoal,

Eu estou com problema, qunado uso o apache Axis 1.4 para gerar wsdl;

O primeiro erro é o seguinte: eu tenho um atributo que é do tipo Character, mas esse tipo não está sendo gerado no wsdl. Ele diz que tipo não pode ser encontrado! e quando o tipo é Integer ele transforma para int.

obs.: para funcionar tive que mudar meus atributos de Character para String. Mas gostaria de usar Character e demais Wrapper classes!

O segundo erro e mais grave é: tenho tipos java.util.Collection como atributos, só que no wsdl fica como ArrayOf_xsd_anyType, e nas classes geradas pelo Axis isso passa a ser um array de objects (Object[]);

Alguem sabe como faz para consumir um web service de objetos complexo que contenha Collection (de preferência com Axis), sem que ela se transforme em objects[]? assim como Wrapper classes (Character)?

Obrigado,

Osmar Barreto

9 Respostas

T

Evite usar Collection em web services. Em vez disso, use os arrays correspondentes, nem que você tenha de usar aquelas APIs da classe java.util.Arrays e java.util.Collections (que convertem Collections em arrays e vice-versa) para passar e receber os valores.

errado: Collection<SuaClasse> atributo
certo: SuaClasse[] atributo

Rafael_Nunes

Por que disso, thingol?

T

Já vi muita gente perder sábados, domingos e feriados porque definiu parâmetros ou valores de retorno em Web Services dessa maneira.
Resumindo: até o Java 1.4, Collection é uma coleção de qualquer coisa, portanto só dá para efetuar uma “serialização” (modo de dizer) para Object. Depois do Java 1.4 dá para você fazer uma Collection de alguma coisa, mas acho que isso não foi propagado direito para o Web Services.

Rafael_Nunes

Hun, tá certo.
Bregado.

obs

Eu estou utilizando por exemplo uma classe Autor:

public class Autor extends AbstractDTO {
 
	private static final long serialVersionUID = 1L;
	private Integer identificador;
	private String nome;
	private String login;
	private String senha;

	private Set locks;

                get...and set...

}

Nela eu tenho um Set de locks, pois essa classe é um DTO que mapeia meus HBMs (Hibernate)

public class Lock extends AbstractDTO {
 	private static final long serialVersionUID = 1L;
	private Integer identificador;
	private Autor autor;
}

Só que, quando eu gero o web service com o Axis, ele cria algumas classes tipo, stub, skeleton…etc e cria tb uma classe Autor e Lock, mas desse forma:

public class Autor  extends br.com.pos.AbstractDTO  implements java.io.Serializable {
    
    private java.lang.Integer identificador;
    private java.lang.String login;
    private java.lang.String nome;
    private br.com.pos.Papel papel;
    private java.lang.String senha;

    private java.lang.Object[] locks;

    public Autor() {
    }
}

Então o que você sugere fazer? alterar o Set para Collections ou o Object[] locks para Collections?

Obrigado,

Osmar

T

Poderia ser algo como:

public class Autor extends AbstractDTO {
        ...
 	private Lock[] locks; // este é o que o Web Service vai usar
        private transient Set&lt;Lock&gt; meusLocks; // este é o que você vai usar
 
                 get...and set...
 
 }
obs

muito obrigado amigo!

vou fazer assim.

F3RP4

Olá, posso dar uma sujestão…
Migra sua aplicação para JAX-WS, ele suporta Collections e tambem Generics, e a curva de aprendizado é bem baixa. Lá vai um exemplinho:

package org.me;

import java.util.List;
import java.util.ArrayList;

import javax.jws.WebMethod;
import javax.jws.WebService;

@WebService

public class ExemploWS {

@WebMethod

public List minhaLista() {

List lista = new ArrayList();

lista.add(Olá);

lista.add(GUJ);

return lista;

}

}

Depois disso é sow empacotar e deploy :wink:
Claro q o servidor deve dar suporte a JAX-WS (Glassfish, tomcat tbm da, mas tem q instalar…)

obs

é muito bem vinda sua sugestão, pois eu estou ficando maluco com esse Axis. Trabalhar com array é loucura!

Tem como você me dizer do que eu preciso? Estou trabalhando com jboss 4.0.4 e jdk 1.5, hibernate 3.1 etc… o que mais eu preciso? Caso vc tenho algum tutorial tb agradeço.

valeu

Osmar

Criado 26 de setembro de 2006
Ultima resposta 29 de set. de 2006
Respostas 9
Participantes 4