Back-End

9 fev, 2012

JAX-WS com Apache CXF e Eclipse [passo 1]

Publicidade

Alguns meses atrás, eu tive que migrar o WebServices do meu projeto pessoal baseado em Axis para JAX-WS, que é a API do Java para XML Web Services suportada pela Java Platform, Standard Edition 6 (Java SE 6).

Existem várias implementações do JAX-WS, como:

No meu caso, meu projeto profissional não usa Spring. Escolhemos o Apache CXF, que usa o Spring por padrão, mas você pode gerenciar o CXF sem o Spring.

Eu descobri e aprendi CXF com Eclipse JEE Indigo (funciona também com Eclipse JEE Helios), que fornece o Wizard para gerar a anotação JAX-WS e iniciar a aplicação CXF. Acredito que brincar com o CXF Eclipse Wizard é um bom ponto de partida para aprender o CXF, então eu decidi escrever alguns artigos chamados JAX-WS with Apache CXF and Eclipse, que explicam passo-a-passo como gerar o WebService e o Consumer do WebService com o CXF Eclipse Wizard.

Em meus artigos, usarei:

  • A última versão 2.4.2 do CXF.
  • Tomcat 7 como servidor.
  • Eclipse JEE Indigo.

Mas você pode fazer a mesma coisa com outra versão do CXF e outro servidor. Neste artigo, irei explicar como

  1. Inicializar o CXF Plugin
  2. E criar um Eclipse Dynamic Web Project vazio com o Tomcat 7.

Download

Você pode fazer o download do jaxwswithcxf_step1.zip, que é um zip que contém o Dynamic Web Project jaxwswithcxf vazio.

Por que CXF?

Minha experimentação com Axis2

Quando eu comecei a brincar com JAX-WS, decidi testar o Axis2 porque eu estava feliz com o Axis, mas desapontado com a implementação do JAX-WS do Axis2 por vários motivos:

  • A documentação é muito complexa quando você é novato.
  • A distribuição do axis2 fornece muitos JARs, e não sabemos quais JARs devemos selecionar.
  • O deploy service padrão força você a configurar seu WebService JARs em uma pasta servicejars.
  • É por isso que tentei implementar meu próprio deployer para seguir minha arquitetura customizada (WebService JARs são armazenados em outras pastas), mas o código do deployer padrão do axis2 não é baseado em JAX-WS Endpoint#publish(String address, Object implementor) para fazer o deploy de um WebService.
  • WebService não é um singleton
  • Existem alguns bugs com métodos que não tem nenhum parâmetro etc.

Minha experimentação com CXF

Depois da minha experimentação com o Axis2, eu notei que o Eclipse JEE fornece um wizard para gerar anotações JAX-WS e inicializar um Dynamic Web Project com CXF usando Spring. Infelizmente, não temos Spring no nosso projeto, mas o CXF pode funcionar sem Spring! Irei explicar para você como fazer isso nos próximos artigos.

Hoje não estou desapontado com o CXF por vários motivos:

  • Eclipse JEE Indigo gera bem as anotações JJAX-WS para a classe Java que você irá publicar como WebService.
  • Se você puder usar o Spring, o CXF Wizard será bastante útil, porque ele gera bem o web.xml com o  Spring CXF Servlet e o Spring beans, que são usados para declarar classes que devem ser publicadas como WebService. Escrever um serviço com Spring explica isso.
  • Se você não usar Spring, você ainda pode usar o CXF Wizard para gerar as anotações JAX-WS. Para a publicação do WebService, você precisa fazer isso manualmente com o código Java usando a API JAX-WS Endpoint#publish(String address, Object implementor) para fazer o deploy de um WebService
1 MyService serviceInstance = new MyService();
2 Endpoint.publish("http://localhost:8080/MyService", serviceInstance);

irá fazer o deploy do seu serviço e o tornará disponível em http://localhost:8080/MyService.

Um simples serviço JAX-WS explica isso.

  • A arquitetura do CXF é baseada em CXF Interceptors (In/Out) para fazer algum processo antes (In)/ depois (Out) de chamar o seu WebService. Você pode usar um CXF Interceptor existente ou desenvolver seu próprio interceptor para gerenciar login, segurança etc.
  • O CXF Team está sempre disponível. Assim que você envia suas perguntas/requisitos para a lista de e-mail do CXF, você tem uma resposta.

Instale o CXF

A distribuição CXF fornece várias ferramentas para gerar anotações de JAX-WS, WSDL etc. O CXF Eclipse Plugin usa essas ferramentas para o wizard do CXF.

Instalar o CXF significa:

Faça o download da distribuição CXF

Vá até CXF Download e baixe a última versão da distribuição CXF. Neste artigo, usamos article apache-cxf-2.4.2.zip: 


Unzipe o apache-cxf-2.4.2.zip no seu disco rígido onde você quiser. No meu caso, eu o fiz em C:\Apache\apache-cxf-2.4.2:

Inicie o CXF Eclipse Plugin

Nesta seção, iremos determinar o caminho da distribuição CXF dentro de Preferences do CXF Eclipse. Abra seu Eclipse JEE (Helios ou Indigo) e vá até o menu Window / Preferences:

Essa ação abre a caixa de diálogo Preferences. Clique no item de menu Web Services / CXF 2.x Preferences: 

Clique no botão Add… (na parte direita da caixa de diálogo) para selecionar o caminho da distribuição CXF. Essa ação abre o Add CXF Runtime. Adicione o botão Browse… e selecione o caminho da distribuição CXF (no meu caso, C:\Apache\apache-cxf-2.4.2):

Se o caminho da distribuição do CXF for válido, os campos da caixa de diálogo serão preenchidos automaticamente, assim:

Clique no botão Finish, a caixa de diálogo fecha e a aba do CXF Runtime é preenchida com o CXF Runtime:

Nesse ponto, o CXF Runtime não está disponível. Clique na checkbox para torná-lo disponível:

O CXF Runtime agora está disponível. No próximo artigo, veremos que o CXF Runtime estará presente no wizard genérico do WebServices.

Inicie a aplicação Web CXF

Aqui iremos criar um Dynamic Web Project vazio chamado jaxwswithcxf, que irá hospedar o JAX-WS WebService.

Faça o download do Tomcat 7

Vá até Tomcat 7 Download e baixe a última versão da distribuição Tomcat. Neste artigo, usamos o apache-tomcat-7.0.20.zip:

Unzipe o apache-tomcat-7.0.20.zip no seu disco rígido onde você quiser. No meu caso, eu o fiz em C:\Apache\apache-tomcat-7.0.20: 

Crie um Dynamic Web Project

Nesta seção, iremos criar uma aplicação WEB vazia jaxwswithcxf com Dynamic Web Project. Para fazer isso, vá até menu File/New /Dynamic Web Project: 


O wizard do New Dynamic Web Project abre. Complete com o nome do projeto – jaxwswithcxf – e selecione Target runtime com seu servidor. Se nenhum servidor estiver definido, clique no botão New Runtime… para defini-lo.

Defina o novo servidor

Clique no botão New Runtime… abra o wizard para criar um servidor. Selecione o Tomcat v7.0 Server: 

Clique no botão Next, a página do wizard mostra a seleção do diretório do Tomcat (Tomcat existente ou pasta vazia onde o Tomcat deve ser instalado). Aqui iremos selecionar o Tomcat 7 instalado. Clique no botão Browse… para selcionar o Tomcat home (no meu caso, C:\Apache\apache-tomcat-7.0.20): 


New Dynamic Web Project configurado

Clique no botão Finish, a nova página do wizard do New Dynamic Web Project aparece: 

Os campos nesse wizard estão pré-preenchidos como a versão 3.0 Dynamic Module Web, o que significa que o Tomcat 7.0 suporta o 3.0 servlet (você pode selecionar outra versão se quiser). Clique no botão Finish, e a aplicação WEB vazia jaxwswithcxf é gerada:

Inicie uma aplicação WEB vazia

Agora você pode iniciar o servidor Tomcat e iniciar a aplicação web vazia. Selecione o projeto jaxwswithcxf, clique com o botão direito e selecione menu Run As->Run on Server.

Essa ação abre o wizard para selecionar o servidor: 

Selecione Tomcat 7.0 server e clique no botão Finish. Essa ação cria uma pasta Server na sua área de trabalho que é a configuração do seu Tomcat e inicia a aplicação WEB jaxwscxf WEB: 

Você pode notar que terá um erro 404 porque o web.xml gerado está assim:

01 <?xml version="1.0" encoding="UTF-8"?>
02 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
03 <display-name>jaxwswithcxf</display-name>
04 <welcome-file-list>
05 <welcome-file>index.html</welcome-file>
06 <welcome-file>index.htm</welcome-file>
07 <welcome-file>index.jsp</welcome-file>
08 <welcome-file>default.html</welcome-file>
09 <welcome-file>default.htm</welcome-file>
10 <welcome-file>default.jsp</welcome-file>
11 </welcome-file-list>
12 </web-app>

E sua aplicação web não contém tais arquivos.

Conclusão

Neste artigo, iniciamos o CXF Eclipse Plugin e criamos um Dynamic Web Project vazio com o Tomcat 7.

No próximo artigo, [passo2], iremos criar uma simples classe Java HelloServiceImpl e iremos usar o CXF Eclipse wizard para o expor como um WebService com JAX-WS e CXF.

?

Texto original disponível em http://angelozerr.wordpress.com/2011/08/23/jaxwscxf_step1/