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.
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.....publicclassRetailRmsWs{privateStringitem=null;privateStringitemPack;ArrayList<Pack>listaItens=null;Connectioncon=null;publicArrayList<Order>ListarNotasRms(){//cria uma lista de notasArrayList<Order>listaNotas=newArrayList<Order>();try{con=Conexao.getConexaoOracle();//procura as notas do RMS//String sql = "SELECT campo FROM tabela WHERE campo = 1290635";PreparedStatementstmtNota=con.prepareStatement(sql);ResultSetrsNota=stmtNota.executeQuery();//varre o resultado da busca da notawhile(rsNota.next()){//cria o obejto notaOrdernota=newOrder();//cria e coloca o objeto pack na notanota.setPack(newArrayList<Pack>());//atribui as informações para a notanota.setOrder_no(rsNota.getInt("order_no"));//busca as Packs da notaStringsqlPack="SELECT item FROM ordloc WHERE order_no = '"+nota.getOrder_no()+"'";PreparedStatementstmtPack=con.prepareStatement(sqlPack);ResultSetrsPack=stmtPack.executeQuery();//varre o resultado da busca da Packwhile(rsPack.next()){//cria o obejto packPackpack=newPack();//atribui as informações para a Packpack.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 packpack.setItem(newArrayList<Item>());//procura itens da packStringsqlItensPack="SELECT pack_no FROM packitem_breakout WHERE item = '"+pack.getPackNo()+"'";PreparedStatementstmtItensPack=con.prepareStatement(sqlItensPack);ResultSetrsItensPack=stmtItensPack.executeQuery();while(rsItensPack.next()){Itemitem=newItem();//atribui as informações para o Itemitem.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 notaslistaNotas.add(nota);}System.out.println("LISTA DE NOTAS: "+listaNotas);}catch(SQLExceptione){e.printStackTrace();}finally{try{con.close();}catch(SQLExceptione){e.printStackTrace();}}listaNotas.toArray();//retorna uma lista de notas não verificadasreturnlistaNotas;}publicstaticvoidmain(String[]args)throwsSQLException{RetailRmsWsteste=newRetailRmsWs();teste.ListarNotasRms();}publicvoidsetItem(Stringitem){this.item=item;}publicStringgetItem(){returnitem;}publicvoidsetItemPack(StringitemPack){this.itemPack=itemPack;}publicStringgetItemPack(){returnitemPack;}}
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…
Abs
rafaelpiton
Poise…
quem disso isso, não explicou pq é gambi…bom sei lá.
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.