Webservice com tipos de dados complexos( List ou ArrayList) o que usar? como usar?

6 respostas
rafaelpiton

Eai pessoal…

To començando aqui com Webservice e preciso de ajuda dos senhores.

bom, estou usando Axis2, tomcat 7, eclipse.

fiz uma classe que retorna um arrayList. Porém, quando vou criar um serviço no eclipse da erro, dizendo que o tipo de dado não é compativel com o RPC 1.1.

o que devo fazer? usar?

grande abraço!

6 Respostas

gomesrod

Olá,

Tudo fica mais simples se você retornar array.

Depois da compilação a lista perde a referência de tipo (), então o axis não consegue mapear para o WSDL o tipo contido nela.

Pode trabalhar com lista normalmente na implementação, mas no retorno do método do webservice faça a conversão usando o método List.toArray

kleins

Fala Rafael, blz?

A minha experiência com webservices me ensinou que se é preciso retornar tipos complexos, é melhor retornar um XML dentro de uma String e vc trata na aplicação cliente de forma mais facil.

Te digo isso pq por ai esta cheio de webservice feito assim e é uma dificuldade tremenda (quando se consegue) se vc precisa consumir usando outras linguagens. JAVA > .NET, .NET > JAVA etc

Abs

rafaelpiton

Pessoal tudo certo!

bom, tem um tal de Stream que serealiza o objeto para XML …só que me falaram q isso é gambiarra, é mesmo?

sobre o array, eu converto para array só que continuar dando problema de RPC

segue ai meu fonte:

//imports.....



public class RetailRmsWs {

	private String item = null;
	private String itemPack;
	ArrayList<Pack> listaItens = null;
	Connection con = null;
	

	
	

	public ArrayList<Order> ListarNotasRms(){

		//cria uma lista de notas
		ArrayList<Order> listaNotas = new ArrayList<Order>();
		
		
		
		try {	
			con = Conexao.getConexaoOracle() ;
			//procura as notas do RMS
			
			//String sql = "SELECT campo FROM tabela WHERE campo = 1290635";
			PreparedStatement stmtNota = con.prepareStatement(sql);
			ResultSet rsNota = stmtNota.executeQuery();

			//varre o resultado da busca da nota
			while(rsNota.next()){

				//cria o obejto nota
				Order nota = new Order();
				//cria e coloca o objeto pack na nota
				nota.setPack(new ArrayList<Pack>());

				//atribui as informações para a nota
				nota.setOrder_no(rsNota.getInt("order_no"));

				//busca as Packs da nota
				String sqlPack = "SELECT item FROM ordloc WHERE order_no = '"+nota.getOrder_no()+"'";
				PreparedStatement stmtPack = con.prepareStatement(sqlPack);
				ResultSet rsPack = stmtPack.executeQuery();

				//varre o resultado da busca da Pack
				while (rsPack.next()) {
					//cria o obejto pack
					Pack pack = new Pack();

					//atribui as informações para a Pack
					pack.setPackNo(rsPack.getString("ITEM"));

					//Adiciona a pack direto na nota (sem passar por variavel)
					//nota.getPack().add(pack);

					//cria e coloca o objeto item na pack
					pack.setItem(new ArrayList<Item>());


					//procura itens da pack
					String sqlItensPack = "SELECT pack_no FROM packitem_breakout WHERE item = '"+pack.getPackNo()+"'";
					PreparedStatement stmtItensPack = con.prepareStatement(sqlItensPack);
					ResultSet rsItensPack = stmtItensPack.executeQuery();

					while(rsItensPack.next()){

						Item item = new Item();

						//atribui as informações para o Item
						item.setItemNo(rsItensPack.getString("pack_no"));

						//Adiciona o item direto na pack (sem passar por variavel)
						pack.getItem().add(item);
					}
					
					//Adiciona a pack direto na nota (sem passar por variavel)
					nota.getPack().add(pack);
					
				}


				//e adiciona o objeto nota na lista de notas

				listaNotas.add(nota);
				
			}
			System.out.println("LISTA DE NOTAS: " + listaNotas);


		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			try {
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		listaNotas.toArray();
		//retorna uma lista de notas não verificadas
		return listaNotas;
	}


	public static void main(String []args) throws SQLException{


		RetailRmsWs teste = new RetailRmsWs();
		teste.ListarNotasRms();

	}


	public void setItem(String item) {
		this.item = item;
	}


	public String getItem() {
		return item;
	}


	public void setItemPack(String itemPack) {
		this.itemPack = itemPack;
	}


	public String getItemPack() {
		return itemPack;
	}

}
kleins

No inicio eu também achava isso gambiarra, mas acabei notando que pra interoperabilidade era a melhor solução.

Ai nos WS que faço, quando tenho que mandar objetos complexos, mando em XML…

Se não me engano os WS da Sefaz usam este tipo de estratégia… vc gera um XML da nota e manda no metodo que recebe uma String.

Na minha opnião, tudo no SOAP é XML mesmo…

Quem sabe alguém do forum não explica pra nós as vantagens e desvantagens e o “pq” que é gambiarra… :smiley:

Abs

rafaelpiton

Poise…

quem disso isso, não explicou pq é gambi…bom sei lá.

tava lendo aquihttp://www.guj.com.br/java/42272-collection-em-web-service

que o tal de JAX-WS já possui suporte Collections e tambem Generics, só que não usei…

sabe de alguma coisa?

bom, como você faz para para serealiar o objeto em XML?

VLW!

kleins

Opa.

Uso o jaxb pra fazer isso.

Um cuidado que vc deve ter é que se vc for serializar beans de entidade, pode te trazer as relações… ai ja viu. Neste caso é melhor usar um V.O (T.O) pra transformar em XML.

Multidao multi = new Multidao();
                        multi.setLocal("SP");
                        multi.setPasseata("Motoboys");

                        ArrayList<Pessoa> lista = new ArrayList<Pessoa>();
                        Date d = new Date();
                        Pessoa p = new Pessoa("Rafael", 25, d, "homem");
                        System.out.println(p.getNome());
                        multi.add(p);
                        Pessoa p1 = new Pessoa("Rodrigo", 31, d, "homem");
                        multi.add(p1);
                        Pessoa p2 = new Pessoa("Rafael 2", 26, d, "homem");
                        multi.add(p2);
                        Pessoa p3 = new Pessoa("Mauro", 35, d, "homem");
                        multi.add(p3);

                        for (int i = 0; i < 100; i++) {
                            Pessoa pn = new Pessoa("Nome_"+i, i, d, "homem");
                            multi.add(pn);
                        }

                       
            StringWriter writer = new StringWriter();
            JAXBContext context = JAXBContext.newInstance(Multidao.class);
            Marshaller m = context.createMarshaller();
            m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            //m.marshal(multi, System.out);
            m.marshal(multi, writer);
            name = writer.getBuffer().toString();

Resultado no webservice

<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
    <S:Body>
        <ns2:helloResponse xmlns:ns2="http://ws.t2software.com.br/">
            <return>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<multidao local="SP" passeata="Motoboys">
    <desordeiros>
        <pessoa tipo="homem">
            <idade>25</idade>
            <nascimento>2011-08-11T17:49:14.526Z</nascimento>
            <nome>Rafael</nome>
        </pessoa>
        <pessoa tipo="homem">
            <idade>31</idade>
            <nascimento>2011-08-11T17:49:14.526Z</nascimento>
            <nome>Rodrigo</nome>
        </pessoa>
        <pessoa tipo="homem">
            <idade>26</idade>
            <nascimento>2011-08-11T17:49:14.526Z</nascimento>
            <nome>Rafael Tosta</nome>
        </pessoa>
        <pessoa tipo="homem">
            <idade>35</idade>
            <nascimento>2011-08-11T17:49:14.526Z</nascimento>
            <nome>Mauro</nome>
        </pessoa>
        <pessoa tipo="homem">
            <idade>0</idade>
            <nascimento>2011-08-11T17:49:14.526Z</nascimento>
            <nome>Nome_0</nome>
        </pessoa>
        <pessoa tipo="homem">
            <idade>1</idade>
            <nascimento>2011-08-11T17:49:14.526Z</nascimento>
            <nome>Nome_1</nome>
        </pessoa>
        <pessoa tipo="homem">
            <idade>2</idade>
            <nascimento>2011-08-11T17:49:14.526Z</nascimento>
            <nome>Nome_2</nome>
        </pessoa>
        <pessoa tipo="homem">
            <idade>3</idade>
            <nascimento>2011-08-11T17:49:14.526Z</nascimento>
            <nome>Nome_3</nome>
        </pessoa>
        <pessoa tipo="homem">
            <idade>4</idade>
            <nascimento>2011-08-11T17:49:14.526Z</nascimento>
            <nome>Nome_4</nome>
        </pessoa>
        <pessoa tipo="homem">
            <idade>5</idade>
            <nascimento>2011-08-11T17:49:14.526Z</nascimento>
            <nome>Nome_5</nome>
        </pessoa>
        <pessoa tipo="homem">
            <idade>6</idade>
            <nascimento>2011-08-11T17:49:14.526Z</nascimento>
            <nome>Nome_6</nome>
        </pessoa>
        <pessoa tipo="homem">
            <idade>7</idade>
            <nascimento>2011-08-11T17:49:14.526Z</nascimento>
            <nome>Nome_7</nome>
        </pessoa>
        <pessoa tipo="homem">
            <idade>8</idade>
            <nascimento>2011-08-11T17:49:14.526Z</nascimento>
            <nome>Nome_8</nome>
        </pessoa>
        <pessoa tipo="homem">
            <idade>9</idade>
            <nascimento>2011-08-11T17:49:14.526Z</nascimento>
            <nome>Nome_9</nome>
        </pessoa>
    </desordeiros>
</multidao>
</return>
        </ns2:helloResponse>
    </S:Body>
</S:Envelope>

abs

Criado 11 de agosto de 2011
Ultima resposta 11 de ago. de 2011
Respostas 6
Participantes 3