Apache CXF - Framework Open-Source para disponibilização de Web Services
Por Caio Paes
(caio.paes@ccc.ufcg.edu.br)
Veja um exemplo simples e curto de como disponibilizar uma API como um Web Service. O Apache CXF é um framework que mediará a comunicação entre a sua aplicação e aplicações clientes, permitindo que estas executem chamadas remotas.

Neste mês, vamos aprender a disponibilizar operações de uma aplicação Java como um Serviço Web. O uso de Web Services (o termo em inglês é mais usual) é voltado a proporcionar a comunicação entre aplicações. É importante não julgar um Web Service como uma aplicação que roda num browser. O uso dessa tecnologia visa a troca de mensagens para obtenção de informações de terceiros ou de uma API que tem interesse em ser pública. Seu uso é, portanto, invisível ao usuário. Ocorre na troca de dados, por mensagens SOAP, HTTP, dentre outras, e não na sua apresentação.

Alguns exemplos de Web Services são as API disponibilizadas por redes sociais. Facebook, Twitter e Google+, por exemplo, permitem que desenvolvedores saibam como fazer a troca de informações entre as suas aplicações e as redes sociais. A documentação e as informações sobre o uso dessas API são, normalmente, encontradas nas páginas para os desenvolvedores de cada serviço.

O link (http://cxf.apache.org/,Apache CXF) é uma solução, no contexto de Web Services, que provê a estrutura para tornar uma API acessível pela Internet. Ele permite que o desenvolvedor disponibilize a API por meio das duas formas mais comuns de uso de Web Services: JAX-WS (Java API for XML Web Services - que realiza troca de mensagens SOAP) e JAX-RS (Java API for RESTful Web Services - que realiza troca de mensagens REST sobre HTTP).

Nesta matéria, vamos exemplificar a criação de um Web Service com a JAX-WS. Essa API existe na biblioteca padrão de Java e o desenvolvimento do lado servidor é menos trabalhoso com ela. Se o programador deseja disponibilizar seu serviço como uma API RESTful, existem mudanças que impactam na arquitetura da sua aplicação. O código utilizado pela JAX-WS se trata de anotações que discriminam os elementos do serviço, como operações, parâmetros etc.

Veja, a seguir, uma fachada com métodos que serão executados pelas requisições das aplicações clientes do serviço. Posteriormente, utilizaremos o Apache CXF para tornar os métodos acessíveis a chamadas remotas.

package petnews.colunajava.apachecxf.model;
// HelloMatematica.java
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
@WebService
public interface HelloMatematica {

        @WebMethod
        public Integer quadrado(@WebParam Integer num);
        
        @WebMethod
        public void incrementaX(@WebParam Integer x);
        
        @WebMethod
        public Integer valorAtual();
}

Na interface acima, marcamos os métodos e parâmetros com as anotações da JAX-WS. Na implementação, não será necessária a adição dessas anotações. Veja a implementação, muito simples, a seguir.

package petnews.colunajava.apachecxf.model;
// HelloMatematicaImpl
public class HelloMatematicaImpl implements HelloMatematica {
        
        private Integer valorAtual;
        
        public HelloMatematicaImpl() {
                this.valorAtual = 0;
        }
        @Override
        public Integer quadrado(Integer num) {
                return num*num;
        }
        @Override
        public void incrementaX(Integer x) {
                this.valorAtual += x;
        }
        @Override
        public Integer valorAtual() {
                return this.valorAtual;
        }
}

Até agora, não utilizamos o Apache CXF. O desacoplamento entre framework e o código do serviço é um ponto positivo do Apache CXF. Veja, a seguir, a classe que, quando executada, manterá o Apache CXF como um servidor que ficará escutando chamadas no endereço indicado.

package petnews.colunajava.apachecxf.webservice;
// HelperServer.java
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
import petnews.colunajava.apachecxf.model.HelloMatematica;
import petnews.colunajava.apachecxf.model.HelloMatematicaImpl;
public class HelperServer {
        public static void main(String[] args) {
                HelloMatematicaImpl implementor = new HelloMatematicaImpl();
                JaxWsServerFactoryBean svrFactory = new JaxWsServerFactoryBean();
                svrFactory.setServiceClass(HelloMatematica.class);
                svrFactory.setAddress("http://localhost:1234/hellomatematica");
                svrFactory.setServiceBean(implementor);
                svrFactory.getInInterceptors().add(new LoggingInInterceptor());
                svrFactory.getOutInterceptors().add(new LoggingOutInterceptor());
                svrFactory.create();
        }
}

Observe que a única informação que o Apache CXF precisa é a interface da fachada e um objeto instanciado. Executando o código acima, algumas mensagens serão exibidas e o programa se manterá em loop, escutando na porta 1234 - para esse exemplo, por requisições.

As aplicações cliente que desejarem se comunicar e utilizar esse ou qualquer Web Service precisarão conhecer suas definições de nomes de operações, tipos de dados tratados, fluxo das operações etc. Essas informações ficarão disponíveis, padronizadas com a sintaxe WSDL (Web Services Definition Language), no link “http://localhost:1234/hellomatematica?wsdl”.

Com o conhecimento do WSDL do serviço, uma aplicação cliente poderá se comunicar e utilizar as operações que disponibilizamos. Existem várias formas de estabelecer a comunicação do lado cliente. Uma delas é por meio do uso do Apache CXF. O código é muito similar ao da classe HelperServer do exemplo acima. O cliente também precisa conhecer a interface HelloMatematica.

O Apache CXF recebe muitos elogios em blogs e discussões sobre o tema Web Services. A sua capacidade de permitir o uso de troca de mensagens SOAP e REST é um bom diferencial em relação a outros frameworks. O código-fonte do exemplo pode ser encontrado aqui.

Jornal PETNews - Edição: Jeymisson Oliveira - Revisão: Savyo Nóbrega e Joseana Fechine
Grupo PET Computação UFCG, 2012. All rights reserved.