Whats new? | Login | Parceiros
Cadastre-se | Atendimento | RSS
+ Java:
artigos   |   vídeos   |    cursos   |    mais

Fazendo seus web services pegarem fogo com XFire

Aprenda neste artigo como construir web services utilizando o XFire.

DANIEL QUIRINO OLIVEIRA
Daniel Quirino Oliveira ( daniel@nullability.org), 23 anos, faz Bacharelado em Informática pela Universidade de São Paulo (USP/ICMC) e é desenvolvedor Java há 8 anos, trabalhando atualmente como analista de sistemas para a EDS do Brasil, já tendo par...


Ver space do autor


Estatísticas:
Visualizações:
42838
Favoritado:
 5 vez(es)
Conteúdo:
Didática:
Utilidade:
3 2
votos: 5

Serviços:



Fazendo seus web services pegarem fogo com XFire

Um breve histórico sobre integração
Integrar aplicações sempre foi um dos grandes desafios no mundo da tecnologia da informação. A partir do momento em que passaram a existir duas aplicações autônomas em uma organização, a necessidade de integrá-las passou a existir. E, como a imaginação humana é algo surpreendente, surgiram diversas soluções para o problema da integração. No passado, algumas aplicações trocavam dados através de arquivos compartilhados. Nem é preciso dizer a tragédia que isso significa. Uma outra estratégia de integração foi fazer com que as duas aplicações trocassem informações diretamente através de sockets. Embora seja uma solução melhor do que a primeira, ainda não era muito efetiva. Controlar todo o processo de troca de mensagens através de socket necessitava ainda de duas coisas:

  1. um protocolo
  2. controle manual das transações

E isso tornava o trabalho de integração complicado. O passo seguinte foi dado através da criação de protocolos de RPC (remote procedure call), criando protocolos para a invocação de serviços públicos de outras aplicações e bases para manipulação de transações, mas ainda assim RPCs não resolviam o problema de integração, pois estes protocolos normalmente eram específicos para uma única plataforma (como Java RMI ou .NET Remoting), o que inviabilizava a integração entre sistemas feitos em plataformas distintas.

A próxima solução
A idéia dos mecanismos de RPC eram interessantes. Ao invés de se compartilhar dados (que poderiam ser facilmente corrompidos por diferentes sistemas, tornando-os inconsistentes), as aplicações passavam a compartilhar serviços especializados, disponibilizando uma série de regras de negócio a quem quisesse usar, mas sem que os dados ficassem indevidamente expostos. Porém, como dito anteriormente, tais mecanismos eram muitas vezes dependentes de uma determinada tecnologia, o que impossibilitava, por exemplo, que uma aplicação COBOL conversasse com uma aplicação Java.

Contudo, a idéia dos RPCs é boa e só precisava ser aprimorada. E, de certa forma, estes aprimoramentos vieram com os Web Services. De maneira bem resumida, pode-se considerar que os Web Services são mecanismos de RPC que utilizam padrões abertos (como o protocolo HTTP e o padrão XML) para troca de mensagens, permitindo, assim, que sistemas, mesmo de diferentes plataformas, possam interagir entre si. A plataforma Java suporta Web Services desde 2000, mas desde então produzir um Web Service em Java não tem sido uma tarefa muito simples (diferentemente dos nossos colegas programadores .NET, que são capazes de criar um simples Web Service em questão de minutos). Quer dizer, produzir um Web Service costumava não ser uma tarefa tão simples, pois este artigo vai lhe mostrar como é fácil criar um Web Service usando o XFire (http://xfire.codehaus.org), o novo framework para Web Services da Codehaus (www.codehaus.org).

Nota: Neste artigo, estamos supondo que você já tenha experiência na criação de aplicações Web. Para os exemplos deste artigo, foram usados Apache Tomcat 5.5 (http://tomcat.apache.org) como servlet container sobre JVM 1.5.0_06 (http://java.sun.com/j2se/1.5.0/) e XFire versão 1.1 (http://xfire.codehaus.org).

Code on fire!
Criar um WebService usando o XFire é tão simples quanto contar até 3:

  1. Crie uma classe Java com os serviços que você pretende disponibilizar (pode ser um Service Façade para vários outros componentes do seu sistema, isso não importa);
  2. Configure sua aplicação;
  3. Crie o cliente do seu Web Service;

Então, vamos contar até 3 e colocar nossos Web Services para funcionar.

Criando nossa classe Java
No nosso exemplo, vamos implementar um conversor de moedas. Na verdade, não é um conversor completo, é apenas um conversor de Reais (BRL) para Dólares (USD), Libras Esterlinas (GBL) ou Euro (EUR). O código segue conforme abaixo.

package org.nullability.xfire.demo.bank;
// interface para definição do nosso serviço
public interface CurrencyConversionService{
 public Double convert(Double ammount, String toCurrency);
}

package org.nullability.xfire.demo.bank.impl;
// implementação do nosso serviço de conversão de moedas
public class CurrencyConversionServiceImpl implements
                          CurrencyConversionService {
 public Double convert(Double ammount, String toCurrency){
      Double convertedAmmount = 0.0;
      if("BRL".equalsIgnoreCase(toCurrency)){
         convertedAmmount = ammount;
      } else {
         if("USD".equalsIgnoreCase(toCurrency)){
            convertedAmmount = ammount * 2.3;
         }
         if ("GBP".equalsIgnoreCase(toCurrency)){
             convertedAmmount = ammount * 4.21;
         }
         if ("EUR".equalsIgnoreCase(toCurrency)){
             convertedAmmount = ammount * 2.89;
         }
       } return convertedAmmount;
  }
}

Configurando nossa aplicação
A configuração se dá em 3 passos. O primeiro é configurar o servlet do XFire na nossa aplicação para que ele consiga disponibilizar nossas classes Java como Web Services. Para tanto, é preciso alterar o arquivo web.xml da sua aplicação web para que este servlet seja carregado.

XFire XFire Servlet org.codehaus.xfire.transport.http.XFireConfigurableServlet config services.xml XFire /servlet/XFireServlet/* XFire /services/*

O segundo passo é configurar quais serão os serviços a serem carregados e disponibilizados. Para isso, é preciso criar um arquivo chamado services.xml, onde definimos o nome do serviço, seu namespace e as classes que serão usadas neste serviço. Este arquivo deve ser colocado no class path da sua aplicação web, normalmente em WEB-INF/classes.

Banking bank org.nullability.xfire.demo.bank.CurrencyConversionService org.nullability.xfire.demo.bank.impl.CurrencyConversionServiceImpl

E, por fim, resolvemos as dependências do XFire, adicionando ao diretório WEB-INF/lib os seguintes arquivos .jar:

·         activation-1.0.2.jar

·         commons-codec-1.3.jar

·         commons-httpclient-3.0.jar

·         commons-logging-1.0.4.jar

·         jaxen-1.1-beta-8.jar

·         jdom-1.0.jar

·         log4j-1.2.x.jar

·         mail-1.3.3_01.jar

·         spring-1.2.x.jar

·         stax-api-1.0.jar

·         wsdl4j-1.5.2.jar

·         wstx-asl-2.9.jar

·         xbean-2.1.0.jar

·         xbean-spring-2.2.jar

·         xfire-all-1.0.jar

·         XmlSchema-1.0.jar

E estamos prontos. Para verificar se seu Web Service está funcionando, tente acessá-lo através da URL: http://localhost:8080/[NOME_DA_SUA_APLICACAO]/services/Banking?wsdl.

Criando o cliente
O cliente é bem simples. Ele apenas invoca o nosso serviço de conversão de moedas através da interface CurrencyConversionService que definimos (e isso explica o motivo pela qual criamos esta interface).

package org.nullability.xfire.demo.bank.client;

import java.net.MalformedURLException;
import org.codehaus.xfire.XFire;
import org.codehaus.xfire.XFireFactory;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
import org.nullability.xfire.demo.bank.CurrencyConversionService;
import static java.lang.System.out;
 public class DummyClient {
 
     public static void main(String... args) throws MalformedURLException {
 
          Service serviceModel = new ObjectServiceFactory().create

                                         (CurrencyConversionService.class);
       // determina qual o tipo de objeto que vamos querer criar
 
          XFire xfire = XFireFactory.newInstance().getXFire();
       XFireProxyFactory factory = new XFireProxyFactory(xfire);
       // proxy para nosso serviço
       String serviceUrl = http://localhost:8080/XFire/services/Banking;

       // URL para acessar o web service
       CurrencyConversionService client = null;
       client = (CurrencyConversionService) factory.create(serviceModel,

                                                           serviceUrl);
       // obtendo referência ao proxy do seu web service.
      
Double ammount = client.convert(1000.0, "GBP");
       // invocando o serviço... out.println(ammount);
    }
}

Antes de executar o cliente do nosso Web Service, não se esqueça de configurar seu classpath com as dependências corretas:

·         commons-codec-1.3.jar

·         commons-logging-1.0.4.jar

·         commons-httpclient-3.0.jar

·         log4j-1.2.x.jar

·         servlet.jar

·         xfire-all-1.0.jar

·         XmlSchema-1.0.jar

Simples, fácil, rápido e indolor, como toda tecnologia deveria ser. XFire é um projeto muito promissor e que possui uma série muito grande de recursos a serem explorados, como compatibilidade com os mais importantes padrões Web Services (SOAP, WSDL, WS-I Basic Profile, WS-Addressing, WS-Security, WS-Attachments, etc), integração com Spring Framework, suporte a vários mecanismos de transporte (sim, você não precisa ficar preso ao protocolo HTTP se você não quiser!), além de oferecer suporte à JSR-181, que visa oferecer anotações para definições de Web Services. No entanto, este artigo é apenas um aperitivo. Temas mais complexos serão abordados mais para frente. Espero que tenham gostado e continuem acompanhando este humilde colunista. Até a próxima.





Participe! Inclua um comentário
[Fechar]

Este post é fechado - você precisa ter acesso ao post para incluir um comentário.


Bruno Leonardo
18/6/2007 21:00
Dúvida! Queria saber como uso o Xfire para consumir os serviços de um a aplicação feita em outra linguagem? No exemplo vc deu um import para a classe CurrencyConversionService, mas como seria para o caso citado acima?

[responder]

 
Bruno Leonardo
21/6/2007 12:17
Resposta Olá, sei q vc deve estar bastante ocupado, mas qdo tive rum tempinho responde minha pregunta? Obrigado!

[responder]

 
Marcos de Sousa
3/7/2007 17:41
Cliente Externo Como consumir um XFire Web Service dum cliente externo? Podes mostrar para teu exemplo como seria? Essa é mesma pergunta do Leonardo. Envie algo para sousa1981 AT yahoo DOT com DOT br

[responder]

 
Anddre Serpa
10/7/2007 19:22
Tipos complexos Gostaria de saber como posso passar um objeto(criado por mim) como parametro no metodo invoke do xfire?

[responder]

 
Rameee
20/9/2007 13:43
IMPORTANTE!!! Vc esquece de mtos detalhes importantes no seu tutorial, como a ordem de chamada das libs, o uso dos properties do log4j e o common. Fora que para a configuração do XFire no WSAD é bem diferente, com a atenção a alguns detalhes nele. Realmente essa api é bastante simples, mas sem as configurações necesseárias ela só da dor d kbeça! rs...

[responder]

 
Humberto
12/6/2008 12:20
validação do xml. Olaa... kra otimo artigo... podia rolar um artigo mais avançado... como por exemplo como validar o xml através do wsdl... estou desenvolvendo um web services utilizando o X-fire... Minha dificuldade é editar o wsdl com as anotações do meu bean... quero fazer com que a validação do xml seja feito nas regras do xsd no wsdl... por exemplo... view plaincopy to clipboardprint? 1. //classe pojo 2. public class ObjetoVo{ 3. private String ticket; 4. private String status; 5. private String tempo; 6. private String mensagem; 7. 8. //getters and setters... 9. } 10. 11. 12. //web service... 13. public class ExemploImpl implements IExemplo { 14. 15. public OutroObjetoVo setExemplo(ObjetoVo exemplo) 16. OutroObjetoVo obj = new OutroObjetoVo(); 17. //regras de negocio 18. return obj 19. } //classe pojo public class ObjetoVo{ private String ticket; private String status; private String tempo; private String mensagem; //getters and setters... } //web service... public class ExemploImpl implements IExemplo { public OutroObjetoVo setExemplo(ObjetoVo exemplo) OutroObjetoVo obj = new OutroObjetoVo(); //regras de negocio return obj } o que quero fazer eh que no meu wsdl soh aceite o ObjetoVo caso ele siga as regras do xsd abaixo... //xsd view plaincopy to clipboardprint? 1. ?xml version="1.0" encoding="UTF-8"?> 2. xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 3. xs:element name="status"> 4. xs:simpleType> 5. xs:restriction base="xs:string"> 6. xs:enumeration value="ER"/> 7. xs:enumeration value="PR"/> 8. xs:enumeration value="AN"/> 9. xs:enumeration value="AP"/> 10. xs:enumeration value="BL"/> 11. xs:enumeration value="PN"/> 12. xs:enumeration value="RC"/> 13. /xs:restriction> 14. /xs:simpleType> 15. /xs:element> 16. xs:element name="setExemplo"> 17. xs:complexType> 18. xs:sequence> 19. xs:element name="ticket" minOccurs="1" maxOccurs="1" type="xs:string"/> 20. xs:element ref="status" minOccurs="1" maxOccurs="1"/> 21. xs:element name="tempo" type="xs:string" minOccurs="1" maxOccurs="1"/> 22. xs:element name="mensagem" type="xs:string" minOccurs="1" maxOccurs="1"/> 23. /xs:sequence> 24. /xs:complexType> 25. /xs:element> 26. /xs:schema> ?xml version="1.0" encoding="UTF-8"?> xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> xs:element name="status"> xs:simpleType> xs:restriction base="xs:string"> xs:enumeration value="ER"/> xs:enumeration value="PR"/> xs:enumeration value="AN"/> xs:enumeration value="AP"/> xs:enumeration value="BL"/> xs:enumeration value="PN"/> xs:enumeration value="RC"/> /xs:restriction> /xs:simpleType> /xs:element> xs:element name="setExemplo"> xs:complexType> xs:sequence> xs:element name="ticket" minOccurs="1" maxOccurs="1" type="xs:string"/> xs:element ref="status" minOccurs="1" maxOccurs="1"/> xs:element name="tempo" type="xs:string" minOccurs="1" maxOccurs="1"/> xs:element name="mensagem" type="xs:string" minOccurs="1" maxOccurs="1"/> /xs:sequence> /xs:complexType> /xs:element> /xs:schema> o Xfire gera o wsdl com o xsd com regras basicas... preciso incrementar o wsdl para que o xml seja validado pelo wsdl... tentei seguir alguns exemplos da net... porem sem sucesso...

[responder]

 
Humberto
12/6/2008 12:22
nao rolou.. =] xii nao rolou postar o codigo... tem algum email q posso lhe encaminhar??? qq coisa postei minha duvida no guj tbm... http://www.guj.com.br/posts/list/93628.java abraço... obrigado pela ajuda...

[responder]

 



 
 

[Este post ainda não foi associado a uma sequência]


[Fechar]
Este post está disponível para assinantes da Java Magazine ou para quem possui Créditos DevMedia.

  Conheça os planos de créditos DevMedia e visualize esse post agora mesmo!

Plano conveniência – Neste plano este post custa R$ 0,00 (Compre agora)
Esse plano permite que você compre somente um post, pagando por ele seu preço sem desconto.

Plano ocasional: Aqui este post custa: R$ -1,00 (assinante) ou R$ -1,00 (não-assinante)
Este plano é ideal para quem tem interesse em mais de um post. Você compra um mínimo de R$ 50,00 em créditos e ganha, em média, 50% de desconto no preço do post. Compre Créditos agora!

Assinatura de Créditos (Plano econômico) – Aqui este post custa R$ -1,00
Este plano é ideal para quem tem interesse em muitos posts. Com esse plano você compra R$ 180,00 em créditos e ganha, em média, 80% de desconto no preço do post. Assine este plano agora!

> Saiba mais sobre o Sistema de Créditos DevMedia
DevMedia Group   www.devmedia.com.br   |   www.javafree.org   |   www.mrbool.com
2010 - Todos os Direitos Reservados a DevMedia Group - (21) 3382-5038